第一题
var length =10;
function fn() {
console.log( this.length );
}
var obj = {
length: 5 ,
method: function (fn) {
fn();
arguments[0]();
}
}
obj.method(fn , 1)
解析
- 首先,我们在全局定义了一个变量length、一个对象obj 和一个函数 fn,length赋值为10.
- 接下来fn函数,输出this.length.对象
- 对象obj中,obj.length 是5,obj.method 是一个函数。method函数里面的形参也是一个函数,这个函数里面调用了fn函数,arguments是一个伪数组,代表method函数实际接收到的参数列表
- 所以arguments[0]() 就代表了调用arguments的第一项。
- obj.method(fn,1) 代表的就是调用obj当中的method函数,并且传递了两个参数,fn和1
- 分析完了代码的含义,我们看输出结果。
- method函数当中调用的fn函数是全局函数,所以this指向window,this.length = 10.
- 上面说了 arguments0 代表的是调用arguments里面的第一项,也就是传参进来的fn,所以这个this指向的是arguments, method 函数接收的参数是两个,所以arguments.length 就是2.
- 最后的输出结果就是 10 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);
解析
- 首先,我们在全局定义了一个变量x,一个变量y和一个函数a,函数a当中的this.x 等于接收到的参数,返回this,这里要注意,返回的不是this.x ,而是this。
- 接下来我们给x赋值,值为a(5), 又给y进行赋值,值为a(6). 最后我们输出 x.x , y.x。
- 分析完代码的含义,我们来看输出结果
- a函数传了一个参数5,那么 this.x 就被赋值为5,函数a的this指向的就是window,也就是window.x = 5 。
- 上面我们说过,这个函数返回的就是this,也就是this指向的window, x=a(5) 就相当于window.x =window ,此时的 x被赋值为了window 。
- 下面又执行了y = a(6), 也就是说,x的值再次发生了改变,变为了6,y则被赋值为了window。
- console.log(x.x) 就相当于
- console.log(6.x) ,输出的自然是undefined。
- console.log(y.x), 输出的相当于是
- console.log(window.x) , 得到值自然是6
- 所以最后输出的结果为 undefined 6