混淆javascript绑定函数
我运行下面的JS脚本,但只发现混淆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.
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感谢你提出一个解决方案,而不是仅仅告诉他为什么它不起作用。