0
<script>
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);
}

</script>

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fcall

问题:

1.为什么要这样写:this.print、this.species、this.name?我试图删除“这个”,并在控制台日志中显示“未定义”

2.call(animals[i], i)和有什么区别call(this, i)

4

2 回答 2

2

以相反的顺序回答您的问题...

(function()).call(...) 设置函数执行的上下文。即它将this对象设置为第一个参数。在您的示例中,第一个版本设置this为 animals[] 数组中的元素。第二个将上下文设置为任何this内容 - 这里将是全局上下文。

this设置上下文后,您的代码可以使用关键字引用它。在您的第一个问题this中指的是当前的 animals[] 元素,因此它可以提取每种动物的物种、名称等。省略this关键字是指全局范围内未定义的变量。

于 2013-06-14T01:55:23.070 回答
0

您实际上已经创建了一个匿名构造函数,这就是您创建匿名构造函数this时所指的内容。使用call(animals[i])更改数组this中每个对象文字的上下文,animals因为它们通过您的循环。

于 2013-06-14T02:13:32.743 回答