var obj = {
say: function() {
function _say() {
console.log(this);
}
return _say.bind(obj);
}()
};
obj.say();
代码的结果是注销全局或窗口,我想知道为什么bind方法没有将“this”绑定到obj对象上下文?
var obj = {
say: function() {
function _say() {
console.log(this);
}
return _say.bind(obj);
}()
};
obj.say();
代码的结果是注销全局或窗口,我想知道为什么bind方法没有将“this”绑定到obj对象上下文?
obj
仍然没有任何值。因此,您对bind的调用相当于.bind(undefined)
,其行为与您观察到的相同。this
引用window
是因为OrdinaryCallBindThis执行以下步骤(非严格模式):[...]
If thisArgument is undefined or null, then
[...]
Let thisValue be globalEnvRec.[[GlobalThisValue]].
[[BoundThis]]
确实是undefined
。say
函数后面的括号。如果你希望在没有两个连续括号obj.say()()
的情况下调用该函数,请使用.call()
而不是.bind()
。
var obj = {
say: function() {
function _say() {
console.log(this);
}
return _say.call(this);
}
};
obj.say();
this
绑定,为什么不使用一个带有原型的实际对象呢?你展示的代码试图将“实例逻辑”倾入“无实例”的代码中,虽然你可以这样做,因为它是JavaScript,但这也太...愚蠢了吧?你实际上想用这段代码做什么?(或者类似这样的代码) - Mike 'Pomax' Kamermansreturn _say.bind(obj);
行上设置一个断点。 (2) 当它停在那里时,检查obj
的值。 (3) 认真思考。 (4) 向你的 橡皮鸭 解释为什么你要将 IIFE 的结果分配给属性say
。 - user663031