这个陈述混淆了原型绑定

时间:2014-03-12 21:34:52

标签: javascript this bind melonjs

在下面的代码中,我想知道上下文如何绑定到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

谢谢

2 个答案:

答案 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)

this可以被认为是该函数的所有者。只有三条规则可以设置this。它将是

  • 使用new运算符调用的构造函数的新对象(例如new Car()
  • 使用.运算符(例如obj.fn()
  • 调用时对象本身
  • 使用fn.callfn.applyfn.bind
  • 设置的上下文

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