// 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;