<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>
问题:
1.为什么这样写:this.print,this.species,this.name?我试图删除'this',并在控制台日志中显示'undefined'
2. call(animals[i], i)
它与call(this, i)
有什么区别?
答案 0 :(得分:2)
以相反的顺序回答你的问题...
(function())。call(...)设置要执行函数的上下文。即它将this
对象设置为第一个参数。在您的示例中,第一个版本将this
设置为animals []数组中的元素。第二个将上下文设置为任何this
- 这里它将是全局上下文。
设置上下文后,您的代码可以使用this
关键字引用它。在你的第一个问题中,this
指的是当前的动物[]元素,因此它可以提取每只动物的物种,名称等。省略this
关键字是指全局范围中未定义的变量。
答案 1 :(得分:0)
您实际上已经创建了一个匿名构造函数,这是您在创建匿名构造函数时所指的this
。使用call(animals[i])
将this
的上下文更改为animals
数组中通过循环时的每个对象文字。