this指向問題

// 1
var length = 10;
function fn() {
  console.log(this.length);
}

var obj = {
  length: 5,
  method: function(fn) {
    fn();
    arguments[0]();
  }
}

obj.method(fn, 1);

// 2
function a(xx) {
  this.x = xx;
  return this;
}

var x = a(5);
var y = a(6);

console.log(x.x);
console.log(y.x);

第一題:

image.png

這里我們調(diào)用obj.method(fn,1),函數(shù)內(nèi)部先調(diào)用傳入的全局函數(shù)fn,因此此時this指向window,因此打印window.length,結(jié)果是10。
然后再取到arguments(傳入所有實參組成的偽數(shù)組)0,此時arguments=[fn, 1],因此此時調(diào)用的是arguments偽數(shù)組當(dāng)中fn,因此此時fn當(dāng)中的this指向arguments偽數(shù)組,所以this.length = arguments.length = 2。

第二題:

image.png
運(yùn)行過程:

var x = a(5),調(diào)用a函數(shù)時傳入5,表達(dá)式從右向左計算,此時a函數(shù)的this指向window,this.x = window.x = 5;最后把此次函數(shù)調(diào)用的返回值this賦值給全局的x,相當(dāng)于window.x = window,覆蓋掉了原來的window.x = 5。

var y = a(6),與上面的執(zhí)行邏輯相同,相當(dāng)于執(zhí)行了this.x = window.x = 6,此時window.x的值被覆蓋為6,返回的this指向window賦值給y,因此y = window。

運(yùn)行結(jié)果:

x.x = 6.x = undefind;
y.x = window.x = 6;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容