2013-07-16 67 views
2

我运行下面的JS脚本的,但只要找到func2()输出foobar,不George,谁能够解释为什么func2 = func.bind(someuser)不绑定someuserfunc混淆的JavaScript绑定功能

var someuser = { 
    name: 'George', 
    func: function() { 
     console.log(this.name); 
    } 
}; 
var foo = { 
    name: 'foobar' 
}; 
func = someuser.func.bind(foo); 
func(); // output foobar 
func2 = func.bind(someuser); 
func2(); //output foobar 
+1

也许是因为它已经被绑定了? – Shawn31313

+0

我没有得到你的问题 – Qchmqs

+0

@ Shawn31313你应该张贴作为答案btw。 –

回答

0

您已经绑定someuser.func

您可能想要以不同方式设置脚本。

或使用:

func = someuser.func.bind(foo); 
func(); // output foobar 
func2 = someuser.func.bind(someuser); 
func2(); //output foobar 

不要试图重新绑定已绑定功能。

+0

“应该是:”---你为什么这么认为? – zerkms

+0

因为它会返回“George” – Shawn31313

+0

你确定你完全理解'.bind()'是如何工作的吗? HTTPS://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind – zerkms

4

MDN

的bind()函数(ECMAScript中5个术语内部呼叫属性)作为函数它被称为上创建一个新的功能(结合的功能)具有相同功能的主体(绑定函数的目标函数),该值绑定到bind()的第一个参数,,它不能被覆盖

基本上这意味着你不能在已经绑定的函数上调用绑定。

在你的榜样,你必须做的:

func2 = someuser.func.bind(someuser); 
2

我想你想要的是一个弱绑定:

function weakBind(functable, context) { 
    var GLOBAL = this; 

    return function() { 
     return functable.apply(this === GLOBAL ? context : this, arguments); 
    }; 
} 

现在你可以这样做:

var someuser = { 
    name: 'George', 
    func: function() { 
     console.log(this.name); 
    } 
}; 

var foo = { 
    name: 'foobar' 
}; 

var func = weakBind(someuser.func, foo); 
func(); // output foobar 

var func2 = weakBind(func, someuser); 
func2(); //output George 

演示:http://jsfiddle.net/R79EG/


正常绑定的问题在于,一旦将对象绑定到this指针,它就不能被覆盖。弱绑定检查this指针是否设置为GLOBAL对象(在这种情况下使用默认值)。否则它会使用任何新的this指向。


BTW你的情况,它只是更好地做到这一点,而不是:

var someuser = { 
    name: 'George', 
    func: function() { 
     console.log(this.name); 
    } 
}; 

var foo = { 
    name: 'foobar' 
}; 

var func = someuser.func.bind(foo); 
func(); // output foobar 

var func2 = someuser.func.bind(someuser); 
func2(); //output George 

这总比weakBind因为调用func2称之为func这将依次调用someuser.func。然而使用bind,呼叫func2将直接呼叫someuser.func

+0

+1用于提出解决方案,而不是仅仅告诉他为什么它不起作用。 –