【问题标题】:Confused on prototype bindings, this statement对原型绑定感到困惑,这个声明
【发布时间】:2014-03-12 21:34:52
【问题描述】:

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

谢谢

【问题讨论】:

标签: javascript this bind melonjs


【解决方案1】:

简答

在表达式中

obj.f()

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

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

f()

然后f 中的this 绑定到全局对象(在浏览器、窗口中)。

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

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

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

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


要点:函数不携带上下文。 obj.f 是成员访问,它所做的只是从obj 返回属性f 的值。调用函数时设置上下文,f 中的obj.f()f() 存在于全局范围内,在这种情况下,上下文将是全局对象。

长答案

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

【讨论】:

  • 正是我想要的。谢谢!但是在我的第二部分中,我不是将变量的上下文设置为 objects 函数吗?为什么它会丢失 obj 的上下文?我想只有 bind 可以解决这个问题?
  • 你的意思是在 var myFun = obj.myMethod;我的乐趣(); ?问题是 myFun 会影响 obj.myMethod 的值,它是一个函数。但是,函数不携带上下文。而是在调用它们时设置上下文(通过点表达式或直接)。
  • 我也不清楚呼叫点并申请。如果在此处添加它们并澄清它们的用途是有意义的,你可以这样做吗?谢谢
  • @Aegis 很棒的解释!你能扩展 obj.func() 失去上下文到 var 分配吗?
  • @Vikram 我试图对此添加一些解释。我确实意识到我的答案有点混乱;随着时间的推移,我应该希望在构建我的想法时变得更好:)
【解决方案2】:

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

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

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

【讨论】:

  • 这对阅读 Aegis 的解释很有帮助。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
相关资源
最近更新 更多