bind()
是一种方法Function.prototype
。因此,它应该在函数对象上调用,并将返回一个具有相同主体但不同值绑定到的新函数this
。
当使用函数声明(你的第一个场景)时,你不会得到一个函数对象作为回报(你的第一个场景),因此会出错。没有什么可以呼吁bind()
的。
第二个有效,因为你为变量分配了一个函数,所以你得到了一个函数对象。
考虑:
function a() {
return this.variable;
}
a(); // === undefined, because "this" is bound to the global object,
// and global object does not have "variable" defined.
// When not in strict mode, global object === window (in browser env).
var b = window.a.bind({variable: 'value'});
// Since a() was declared, it is a property of the global object (window).
// Lets get it and bind to some object.
b(); // === 'value' - because 'b' is essentialy 'a' bound to {variable: 'value'}.
window.variable = 'other value'; // assign variable to global object
a(); // === 'other value'
b(); // === 'value' - it is not bound to global object, so no change here.
所以在你的例子中你可以这样做:
var myObj = {
foo: function(){
function bar(){
console.log('this', this);
}
var bar2 = bar.bind(this);
bar2();
// Or:
// bar.bind(this)();
}
}