JavaScript:函数引用存储在数组中时的执行上下文

问题描述 投票:0回答:1

请考虑以下代码:

var obj = {
  name: 'Hans',
  print: function(p) {
    console.log(this.name)
  }
};
obj.print(); // prints 'Hans'

我们知道在对象print上调用了obj函数。换句话说,objprint的执行上下文(的一部分)。容易吧?

现在,这就是我正在努力理解的内容:考虑将函数引用存储在数组中:

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

事实证明是错误的。我在这里想念什么?

javascript arrays this executioncontext
1个回答
0
投票

您看到的结果是因为数组实际上是对象,而数组索引是恰好具有数字名称的属性。当一个属性包含一个函数,并且您调用object.property()object["property"]()时,this上下文就是对象。

但是只有当您使用属性访问器或数组索引语法调用该函数时,才会发生这种情况。如果将函数分配给其他变量并通过该函数调用该函数,则与对象的关联将丢失。

© www.soinside.com 2019 - 2024. All rights reserved.