混淆javascript绑定功能

时间:2013-07-16 04:37:25

标签: javascript

我运行以下JS脚本,但只找到func2()输出foobar,而不是George,谁可以解释为什么func2 = func.bind(someuser)不绑定someuserfunc

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

3 个答案:

答案 0 :(得分:4)

来自MDN

  

bind()函数创建一个新函数(一个绑定函数),它具有相同的函数体(ECMAScript 5术语中的内部调用属性),因为它被调用的函数(绑定函数的目标函数)具有此值绑定到bind()的第一个参数,无法覆盖

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

在您的示例中,您必须执行以下操作:

func2 = someuser.func.bind(someuser);

答案 1 :(得分: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指向的任何内容。


在你的情况下,顺便说一句,这样做更好:

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都会直接调用{{1}}。

答案 2 :(得分:0)

您已绑定someuser.func

您可能希望以不同方式设置脚本。

或使用:

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

请勿尝试重新绑定已绑定的功能。