模板文字中的'this'

时间:2016-11-03 19:22:33

标签: javascript ecmascript-6

根据ES6规范,语法

foo`Hello!`

的行为应该与

完全相同
foo('Hello!')
  

在表达式之后放置模板文字会触发函数   调用,类似于参数列表(以逗号分隔的值)   括号)触发函数调用。以前的代码是等效的   到以下函数调用(实际上,函数获得更多   信息,但稍后会解释。)

Source

但是,在以下代码段中,将值绑定到函数会导致2个语法的行为不同:

function alertParans() { alert(this)  }
function alertNoParans() { alert `${this}`  }

var executeParans = alertParans.bind('roman empire');
var executeNoParans = alertNoParans.bind('greek empire');

executeParans();
executeNoParans();

第一个电话会打印'罗马帝国',而第二个电话会打印一个逗号。为什么呢?

Fiddle

1 个答案:

答案 0 :(得分:7)

您应该阅读您链接的示例,因为它说的内容与您声称的不同。

In the section it is stated that the following examples are equivalent

tagFunction`Hello ${firstName} ${lastName}!`
tagFunction(['Hello ', ' ', '!'], firstName, lastName)

现在,如果你要将此应用于警报,它将如下所示:

function alertParans() { alert(['', ''], this);  }
function alertNoParans() { alert`${this}`;  }

var executeParans = alertParans.bind('roman empire');
var executeNoParans = alertNoParans.bind('greek empire');

executeParans();
executeNoParans();

现在你在两种情况下都得到了逗号,因为alert的第一个参数现在总是一个包含两个空字符串的数组。为什么呢?

因为模板文字在('')之前,(this)之间和之后('')插入时被分割为内容。