// 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
这里我们调用obj.method(fn,1),函数内部先调用传入的全局函数fn,因此此时this指向window,因此打印window.length,结果是10。
然后再取到arguments(传入所有实参组成的伪数组)0,此时arguments=[fn, 1],因此此时调用的是arguments伪数组当中fn,因此此时fn当中的this指向arguments伪数组,所以this.length = arguments.length = 2。
第二题:
image.png
运行过程:
var x = a(5),调用a函数时传入5,表达式从右向左计算,此时a函数的this指向window,this.x = window.x = 5;最后把此次函数调用的返回值this赋值给全局的x,相当于window.x = window,覆盖掉了原来的window.x = 5。
var y = a(6),与上面的执行逻辑相同,相当于执行了this.x = window.x = 6,此时window.x的值被覆盖为6,返回的this指向window赋值给y,因此y = window。
运行结果:
x.x = 6.x = undefind;
y.x = window.x = 6;