什么's JavaScript数组中项目的作用域

What's the scope of an item in an JavaScript Array

本文关键字:项目 作用域 数组 JavaScript 什么      更新时间:2023-09-26

我在JavaScript中玩作用域,我对从数组调用函数时遇到的一些问题很好奇。在下面的示例中,我使用三个不同的作用域。一个绑定到一个名为foobar的对象,一个绑定了window,然后第三个实际引用函数本身。我只是好奇为什么函数的作用域是它自己,而不是全局窗口对象。是因为数组访问本身就是一个函数调用,所以存储的函数在本地范围内吗?

var foobar = {
  doWork: function() {
      console.log('doing some work...');
      console.log(this);
  }
}
foobar.doWork(); // `this` will refer to foobar
var doWorkClone = foobar.doWork;
doWorkClone(); // `this` will refer to window
var workClones = [];
workClones.push(foobar.doWork);
workClones[0](); // `this` will refer to the doWork function itself

它们的行为方式相同。在a.b()中,函数a.b被调用,其中this被设置为a

foobar.doWork();  // function is `foobar.doWork`, `this` is `foobar`
workClones[0]();  // function is `workClones[0]`, `this` is `workClones`

这是因为.[]表示法在功能上是相同的。使用哪一个并不重要,是否处理数组也不重要。

要理解这一点,首先,看看js是如何在后台工作的可能会很有帮助。

当您编写f(args)时,js将执行f.call(this, args)。因此,this总是指从何处调用函数。

在您的情况下:

foobar.doWork()   --> foobar
doWorkClone()     --> window or wrapping expression
workClones[0]()   --> "0" is in workClones, so workClones