请考虑以下代码:
var obj = {
name: 'Hans',
print: function(p) {
console.log(this.name)
}
};
obj.print(); // prints 'Hans'
我们知道在对象print
上调用了obj
函数。换句话说,obj
是print
的执行上下文(的一部分)。容易吧?
现在,这就是我正在努力理解的内容:考虑将函数引用存储在数组中:
var funcs = [function(p) {
console.log(this.length, this)
}];
funcs[0](); // prints 1 which is the length of the array 'func' and also [ [Function] ]
这意味着数组中第一个元素在运行时的执行上下文是数组本身!我的假设是存储在数组中的内容不过是对该函数的引用,因此等效于此:
var f = function(p) {
console.log(this)
};
var funcs = [f];
f(); // prints Window
事实证明是错误的。我在这里想念什么?
您看到的结果是因为数组实际上是对象,而数组索引是恰好具有数字名称的属性。当一个属性包含一个函数,并且您调用object.property()
或object["property"]()
时,this
上下文就是对象。
但是只有当您使用属性访问器或数组索引语法调用该函数时,才会发生这种情况。如果将函数分配给其他变量并通过该函数调用该函数,则与对象的关联将丢失。