每日一道面试题

241 阅读2分钟
第一题
 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 和一个函数 fnlength赋值为10.
  • 接下来fn函数,输出this.length.对象
  • 对象obj中,obj.length5,obj.method 是一个函数。method函数里面的形参也是一个函数,这个函数里面调用了fn函数,arguments是一个伪数组,代表method函数实际接收到的参数列表
  • 所以arguments[0]() 就代表了调用arguments的第一项。
  • obj.method(fn,1) 代表的就是调用obj当中的method函数,并且传递了两个参数,fn和1
  • 分析完了代码的含义,我们看输出结果。
  • method函数当中调用的fn函数是全局函数,所以this指向windowthis.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指向的windowx=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