在下面的代码中,我想知道上下文如何绑定到this
:
在obj.myMethod();
中,给对象上下文。因此,记录它会给出对象。
在var myFun = obj.myMethod;
然后myFun();
,上下文被赋予窗口。
唯一的区别是你将函数设置为变量。
var obj = {
myMethod : function () {
console.log(this); //'this' is bound to context of object
}
};
obj.myMethod(); //calling object property directly = Object {myMethod: function}
var myFun = obj.myMethod;
myFun(); //but setting obj method property to a variable and running gives Window as context
编辑:
关注this melonJS tutorial后,我对如何使用此回调感到困惑(向下滚动到第2部分:加载我们的级别,您将看到完整的代码)
// Set a callback to run when loading is complete.
me.loader.onload = this.loaded.bind(this);
我读了this tutorial on callbacks,所以我明白了它们的用途......但我不明白。它说this.loaded.bind(this)
第一个和第二个this
语句之间有什么区别?他们不一样吗?为什么我需要拨打this
然后再.loaded.bind()
,然后再次传入this
?
因此,在您的示例中,您说我可以通过执行var bindMe = obj.myMethod.bind(obj);
来保留上下文,在这种情况下,您使用this
因为您已经在对象game
中?因此this
是指所有者game
?
谢谢
答案 0 :(得分:3)
在表达式
中obj.f()
this
中的{p> f
将绑定到obj
的值(.
左侧的表达式)。
如果调用函数"单独",即
f()
然后this
中的f
绑定到全局对象(在浏览器窗口中)。
也就是说,您可以使用.bind
函数预先设置上下文,即
var g = obj.f.bind(obj);
f(); // success! this == obj
c.f。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
您可能还想查看.call
和.apply
函数。
关键点:功能不要携带上下文。 obj.f
是成员访问权限,它所做的就是从f
返回属性obj
的值。当您调用函数时设置上下文,全局范围内存在obj.f()
或f()
中的f
,在这种情况下,上下文将是全局对象。
阅读规格! :) http://www.ecma-international.org/ecma-262/5.1/#sec-10.3
答案 1 :(得分:1)