试图理解js中的Function.prototype.call

时间:2013-06-14 01:47:52

标签: javascript

<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?我试图删除'this',并在控制台日志中显示'undefined'

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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