为什么这会返回3,1?

Ant*_*tiz 4 javascript

我理解后者,我们在foo对象上调用警报,该对象具有另一个名为baz其属性的对象,该对象又有一个名为barreturn的方法返回值x.而且因为lexical scope(我认为:))的JS编译器/解释上升链,发现xbaz返回1.

我的猜测是,当分配给变量go然后从全局范围调用时,你得到3?只是想知道背景中发生了什么.任何帮助将不胜感激!!!

var x = 3;

var foo = {
    x: 2,
    baz: {
        x: 1,
        bar: function() {
            return this.x;
        }
    }
}

var go = foo.baz.bar;

alert(go());
alert(foo.baz.bar());
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 7

当你做这样的事情:

var go = foo.baz.bar;
go();
Run Code Online (Sandbox Code Playgroud)

你会发现在打电话之前go已经失去了参考.它只是一个指向函数的指针,并且与它所附加的对象没有任何关联.这意味着该方法执行时不会.foo.bazbar()barthisfoo.bazbar

这是明确的.bind()开发目标.你可以像这样使用它:

var go = foo.baz.bar.bind(foo.baz);
go();
Run Code Online (Sandbox Code Playgroud)

而且,它将适合你.你也可以做同样的手动版本:

var go = function() {return foo.baz.bar();}
go();
Run Code Online (Sandbox Code Playgroud)

.bind()现在已经内置到语言中以帮助您解决此类问题.