1

我正在玩 JavaScript 中的作用域,我对从数组调用函数时遇到的一些事情感到好奇。在下面的示例中,我使用三个不同的范围。一个绑定到名为 foobar 的对象,一个绑定到窗口,然后第三个绑定到函数本身。我只是好奇为什么该函数的范围仅限于自身而不是全局窗口对象。是不是因为数组访问本身就是一个函数调用,所以存储的函数在本地范围内?

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
4

2 回答 2

4

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

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

这是因为 the.[]notation 在功能上是相同的。使用哪一个无关紧要,是否处理数组也无关紧要。

于 2012-08-22T16:39:57.813 回答
0

为了理解这一点,了解 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
于 2012-08-22T16:52:40.467 回答