从javascript数组调用函数

use*_*365 12 javascript arrays function this

我有这个代码:

var foo = {
    x: 2,
    bar: function() {
        alert(this.x);
    }
};
Run Code Online (Sandbox Code Playgroud)

为什么foo.bar()警报2时会[foo.bar][0]()发出警报undefined?

Ja͢*_*͢ck 9

所以,技术上[foo.bar][0]等同于foo.bar,但是在调用函数时bar已经失去了与foo对象的"词法绑定" ,所以当你调用它时,JavaScript实际执行以下内容:

foo.bar.call([foo.bar]);
Run Code Online (Sandbox Code Playgroud)

通常,这个表达式:

XXX.yyy(args)
Run Code Online (Sandbox Code Playgroud)

被解释为:

XXX.yyy.call(XXX, args);
Run Code Online (Sandbox Code Playgroud)

在这种情况下XXX是[foo.bar]和.yyy是[0].

要修复它,您需要foo再次显式绑定:

[foo.bar][0].call(foo);
Run Code Online (Sandbox Code Playgroud)