Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
混淆javascript绑定函数_Javascript - Fatal编程技术网

混淆javascript绑定函数

混淆javascript绑定函数,javascript,Javascript,我运行下面的JS脚本,但只发现func2()输出是foobar,而不是George,谁能解释为什么func2=func.bind(someuser)没有将someuser绑定到func var someuser = { name: 'George', func: function () { console.log(this.name); } }; var foo = { name: 'foobar' }; func = someuser.func.

我运行下面的JS脚本,但只发现
func2()
输出是
foobar
,而不是
George
,谁能解释为什么
func2=func.bind(someuser)
没有将
someuser
绑定到
func

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

您已经绑定了
someuser.func

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

或使用:

func = someuser.func.bind(foo);
func(); // output foobar
func2 = someuser.func.bind(someuser);
func2(); //output foobar
不要尝试重新绑定已绑定的函数。

来自:

bind()函数创建一个新函数(绑定函数),其函数体(ECMAScript 5术语中的内部调用属性)和被调用的函数(绑定函数的目标函数)相同,该值绑定到bind()的第一个参数,,不能被覆盖

基本上,这意味着您不能对已经绑定的函数调用bind

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

func2 = someuser.func.bind(someuser);

我想你想要的是一个脆弱的束缚:

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
请参见演示:


普通绑定的问题是,一旦将对象绑定到
指针,它就无法被覆盖。弱绑定检查
指针是否设置为
全局
对象(在这种情况下使用默认值)。否则,它将使用新的
指向的内容


顺便说一句,在您的情况下,最好是这样做:

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

可能是因为它已经被绑定了?我不明白你的意思question@Shawn31313顺便说一句,你应该把它作为一个答案贴出来。“应该:”---你为什么这么认为?因为它会返回“乔治”您确定完全了解
.bind()
的工作原理吗?老兄,你在评论中的回答是对的,但这毫无意义,我也理解。不知道我在做什么。+1感谢你提出一个解决方案,而不是仅仅告诉他为什么它不起作用。