function foo() { console.log( this.a ); } var obj = { a: 2 }; var bar = function() { foo.call( obj ); }; bar.call( window ); // 2
问题是,为什么无法绑定到window对象?
光阴似箭催人老,日月如移越少年。
bar.call( window );
对于bar而言,this已经绑定到window对象上了,但是对于里层的foo
foo.call( obj );
this是绑定到obj对象上的,this.a就相当于obj.a;查找a的时候不会访问到外层的bar对象,所以bar绑定在window上也不会影响foo的结果。
this.a
obj.a
a
bar的调用对象确实改为了window,但是问题在这里:
var bar = function() { foo.call( obj ); };
或许你是想这样,输出undefined
var bar = function () { foo.call(this); }
当然可以绑定到 window 对象,但是你上面这段代码是把 bar 方法中的 this 绑定到了 window 对象,而 foo 方法中的 this 绑定的还是 obj 对象
function foo() { console.log( this.a ); }
var obj = { a: 2 };
var bar = function() { console.log(this.a); // 这里作用域才是window foo.call( obj ); //
};
window.a = 22; bar.call( window ); // 22
对于bar而言,this已经绑定到window对象上了,但是对于里层的foo
this是绑定到obj对象上的,
this.a
就相当于obj.a
;查找a
的时候不会访问到外层的bar对象,所以bar绑定在window上也不会影响foo的结果。bar的调用对象确实改为了window,但是问题在这里:
或许你是想这样,输出undefined
当然可以绑定到 window 对象,但是你上面这段代码是把 bar 方法中的 this 绑定到了 window 对象,而 foo 方法中的 this 绑定的还是 obj 对象
function foo() {
console.log( this.a );
}
var obj = {
a: 2
};
var bar = function() {
console.log(this.a); // 这里作用域才是window
foo.call( obj ); //
};
window.a = 22;
bar.call( window ); // 22