我理解后者,我们在foo对象上调用警报,该对象具有另一个名为baz其属性的对象,该对象又有一个名为barreturn的方法返回值x.而且因为lexical scope(我认为:))的JS编译器/解释上升链,发现x在baz返回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)
当你做这样的事情:
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()现在已经内置到语言中以帮助您解决此类问题.