1

来自MDN

var animals = [
  {species: 'Lion', name: 'King'},
  {species: 'Whale', name: 'Fail'}
];

for (var i = 0; i < animals.length; i++) {
  (function (i) {
    this.print = function () {
      console.log('#' + i  + ' ' + this.species + ': ' + this.name);
    }
    this.print();
  }).call(animals[i], i);
}

在上面的例子中,“this”是如何在“animals”循环内的匿名函数中使用的?我很好奇为什么“this”引用的是动物对象而不是窗口。

例如,如果我要从参数中删除animals[i],那么一切都是未定义的。这是否意味着匿名函数从它们收到的第一个参数中得出它们的“身份”,或者是其他事情发生了?

提前致谢!

4

3 回答 3

3

这不是在您引用自己的文档中解释的吗?function.call()

fun.call(thisArg[, arg1[, arg2[, ...]]])

参数

thisArgthis为有趣的调用提供的值。[...]

然后:

描述

this您可以在调用现有函数时分配不同的对象。

所以你是对的,animals[i]被用作this函数内部。您可以将其视为始终具有this名称的隐式隐藏参数。

于 2012-11-15T17:29:48.783 回答
2

就是这部分:

  }).call(animals[i], i);

通过调用 with .call()this明确指定了 for 的值。

Function原型中有两个类似的功能可用:.call().apply(). 它们都允许使用某些特定值(对对象的引用)作为this.

调用函数时,总是以一种或另一种方式设置this。如果对函数的引用由.or[ ]表达式确定:

something.fn( whatever );

something[ expression ](whatever);

那么 的值this就是基础对象的值(上面例子中的“某物”)。Eich 先生称其为“接收器”,如果您想到诸如 Smalltalk 消息之类的函数调用,这是有道理的。

如果你调用一个没有基础对象的函数,那么 的值this要么是全局对象,要么null是处于“严格”模式。

于 2012-11-15T17:29:25.683 回答
1

因为您正在使用callwhich 定义为:

call(thisScope, args)

因此,您animal[i]作为thisScope手段传递的事实this == animal[i]

于 2012-11-15T17:29:40.567 回答