刚看到一道JS面试题,关于this指向的问题,很有意思,记录一下

题目是这样的

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

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

obj.method(fn, 1);//输出是什么?

先给出答案。


是不是奇怪为啥输入(fn,1)两个参数,是不是贼奇怪为什么不是10和5或者5和5??哈哈,慢慢解释。

首先里面有个套路,我把代码改一个地方就好理解很多。

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

var obj = {
  length: 5,
  method: function(args) {   //修改形参名
    args();
    arguments[0]();
  }
};

obj.method(fn, 1);

看看注释修改的地方,是不是更好理解了。原代码中的fn只是一个形参而已,不是直接指代全局定义的fn方法。

然后JS传参的时候是允许多传的,但是默认按顺序依次使用前面的参数,所以当运行obj.method(fn,1)时,形参fn(即args)变成了全局函数fn(实参),所以this指向全局定义的var length=10;而不是obj对象定义的length:5,所以当运行到fn()这行代码时,输出10。

然后别忘了全局函数fn同时也属于arguments数组中的一员,即当作为arguments成员之一调用的时候,其作用域就绑定到了arguments上,this也就是指向了arguments对象,所以arguments[0]()这段代码调用了身为成员的fn()函数,this.length就等于是arguments.length,又因为method传入的参数为2个,所以最后输出2。


题目是在https://zhuanlan.zhihu.com/p/36550058看到的

我也转载了一波,在本人博客https://blog.csdn.net/sinat_36521655/article/details/80254621中也可以看

前端萌新,嘿嘿。如解释有误,希望大家指出来。

猜你喜欢

转载自blog.csdn.net/sinat_36521655/article/details/80253311