3

在下面的代码中,我想知道上下文是如何绑定的this

obj.myMethod();中,为对象提供了上下文。所以记录它给出了对象。

var myFun = obj.myMethod;thenmyFun();中,上下文被赋予窗口。

唯一的区别是您将函数设置为变量。

    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

编辑:

按照这个 melonJS 教程,我对如何使用这个回调感到困惑(向下滚动到第 2 部分:加载我们的关卡,您将看到完整的代码)

// Set a callback to run when loading is complete.
me.loader.onload = this.loaded.bind(this);

我阅读了关于回调的本教程,所以我了解它们的用途......但我不明白。它说this.loaded.bind(this)

this第一个和第二个语句有什么区别?他们不一样吗?为什么我需要打电话this然后.loaded.bind()再通过this

所以,在你的例子中,你说我可以通过做来保持上下文var bindMe = obj.myMethod.bind(obj);,在这种情况下,你正在使用,this因为你已经在对象中game?所以this指的是主人game

谢谢

4

2 回答 2

3

简短的回答

在表达式中

obj.f()

thiswithinf将绑定到obj( 左侧的表达式.) 的值。

如果一个函数被“单独”调用,即

f()

然后thisinsidef绑定到全局对象(在浏览器中,窗口中)。

也就是说,您可以使用该.bind功能预先设置上下文,即

var g = obj.f.bind(obj);
f(); // success! this == obj

cf https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

您可能还想看看.calland.apply函数。


关键点:函数不携带上下文。obj.f是成员访问,它所做的只是fobj. 当你调用函数时设置上下文,无论是在全局范围内obj.f()还是f()f全局范围内,在这种情况下,上下文将是全局对象。

长答案

阅读规格!:) http://www.ecma-international.org/ecma-262/5.1/#sec-10.3

于 2014-03-12T21:54:02.647 回答
1

this可以认为是函数的所有者。实际上只有三个规则this可以设置。这将是

否则它将是window对象(或者在 ES5 严格模式下为 null)。

于 2014-03-12T21:40:21.337 回答