javascript的bind方法似乎没有按预期工作
javascript的bind方法似乎没有按预期工作,javascript,this,bind,iife,Javascript,This,Bind,Iife,var obj={ say:function(){ 函数_say(){ console.log(this); } 返回_say.bind(obj); }() }; obj.say()您正在立即调用该函数。删除函数后面的括号。如果希望在没有两个连续括号的情况下调用函数,请使用.call()而不是.bind() var obj={ say:function(){ 函数_say(){ console.log(this); } 回电,打电话给(这个); } }; obj.say()赋值期间,变量obj
var obj={
say:function(){
函数_say(){
console.log(this);
}
返回_say.bind(obj);
}()
};
obj.say()代码>您正在立即调用该函数。删除函数后面的括号。如果希望在没有两个连续括号的情况下调用函数,请使用.call()
而不是.bind()
var obj={
say:function(){
函数_say(){
console.log(this);
}
回电,打电话给(这个);
}
};
obj.say()代码>赋值期间,变量obj
仍然没有任何值。因此,对bind的调用相当于.bind(未定义)
,其行为与您观察到的方式相同
更具体地说,此
引用窗口
是因为执行了以下步骤(非严格模式):
打电话后,您可以在chrome调试器中检查[[BoundThis]]
是否确实未定义。谢谢您的回答,@ASDGerte。但是如果说函数将'this'绑定到'undefined',为什么obj.say()中的'this'绑定到global/window而不是obj?@smallbone编辑。我只是在回答后寻找:)我找到了!非常感谢。这里真正的问题是,如果您需要这个
绑定,为什么不在原型中使用实际对象?您展示的代码试图将“实例逻辑”加入到“无实例”代码中,您可以这样做,它是JavaScript,但它也是。。。傻?你到底想用这段代码做什么?(或使用类似的代码)(1)在return\u say.bind(obj)上放置一个断点代码>行。(2) 当它停在那里时,检查obj
的值。(3) 好好想想。(4) 向您的客户解释您试图将IIFE结果分配给属性的确切原因,比如说
。谢谢您的评论,@Mike'Pomax'Kamermans。这段代码是一个公正的实践,我想知道为什么在使用bind(未定义)时“This”是全局的。如果你是规范潜水,这是一个合理的问题,但是你展示的代码永远不值得在你打算实际使用的任何真实文件中使用,或者更糟糕的是,让其他人使用=)
[...]
If thisArgument is undefined or null, then
[...]
Let thisValue be globalEnvRec.[[GlobalThisValue]].