this 誰調(diào)用就是誰
var name = 'a';
var obj = {
name: 'b',
getName: function() {
console.log(this.name);
}
};
obj.getName(); //b
var getName = obj.getName;
getName(); //a
var obj2 = (function() {
return function() {
console.log(this.name);
}
})();
obj2(); //a
obj.getName()調(diào)用getName的是obj,此時this指向的是obj,所以打印的是b
而調(diào)用getName()的是window,此時this指向的是window.所以打印的是a
obj2()里面用到了立即執(zhí)行函數(shù),返回的是一個函數(shù),而調(diào)用的也是window,this指向的是window
var length = 10;
function fn() {
console.log(this.length);
}
var obj3 = {
method: function(fn) {
fn();
arguments[0]();
}
};
obj3.method(fn, 1);//10 2
雖然在程序執(zhí)行時得运,使用了obj3.method方法嗜历,讓this指向了obj3,但是真正的函數(shù)執(zhí)行在函數(shù)體內(nèi)部嘶是,也即當(dāng)fn()執(zhí)行的時候,this是指向window的蛛碌,所以第一次執(zhí)行結(jié)果是10
分析下在method(fn,1)執(zhí)行時聂喇,經(jīng)歷了什么: 首先兩個參數(shù)fn和1會被放入arguments中,在arguments中第一個參數(shù)就是我們傳入的函數(shù)蔚携;接下來fn執(zhí)行希太,此時this沒有綁定因此指向window,輸出10酝蜒。 然而到了arguments0這一句跛十,相當(dāng)于把arguments[0]中的第一個參數(shù)拿來執(zhí)行, 效果如下:
arguments0執(zhí)行,等同于arguments.0()
這樣我們可以更清楚知道,this是指向arguments實例本身
復(fù)制代碼arguments.length就是它本身的長度(arguments是一個類數(shù)組秕硝,具有l(wèi)ength屬性),因此輸出2