一道关于this指向的问题

题目如下:

var length = 10;
function fn() {
    console.log(this.length)
};
var obj = {
    length: 5, 
    method: function (fn) {
        fn();
        arguments[0]();
        fn.call(obj, 12);
    }
};
obj.method(fn, 1);

我的解读如下:

obj.method(fn, 1); 这一段其实是method作为obj的方法调用,this隐式绑定到obj上。执行的是

{
    // 此次调用的this指向obj,arguments为function () { console.log(this.length) }, 1
    fn();
    arguments[0]();
    fn.call(obj, 12);
}

这三条语句。

第一个fn是打印出this.length,以我的理解,this在调用时确定指向,在method函数内这里的this隐式绑定到obj上,结果是打印出5;
第二条语句其实还是fn,但是this绑定谁我不知道,所以结果我也不知道;
第三条语句的this绑定给obj,后面的12是fn的参数没有用,所以打印出5;

结果我的分析只有最后一个答案是正确的,求解惑。

阅读 2.7k
4 个回答

this只需要看执行的时候,其他的地方都不要看。

  1. fn()不属于任何对象,没使用call,直接调用,this是window(浏览器下),所以是length=10;
  2. arguments[0],这个其实有点绕,你可以试试var arr = [function(){console.log(this.length)];arr[0](),它其实属于这种调用方式arguments.0()(当然这么写是不对的),所以this是arguments,而arguments长度就是你传入的参数的个数2。
  3. fn.call(obj, 12);这个就不用说了,this就是obj,length=5

举个例子

var length = 10
var arr = [
    function () {
        console.log(this.length)
    }
]
var fun = arr[0]
fun() //10

这个你可能会问,函数不是属于arr的么,为什么是10?
只与调用时有关fun()直接调用的,就是window


补充下箭头函数的吧

var length = 10;
var fn = () => {
    console.log(this.length)
};
var obj = {
    length: 5, 
    method: function (fn) {
        fn();
        arguments[0]();
        fn.call(obj, 12);
    }
};
obj.method(fn, 1);

你可以再看看这个
箭头函数没有自己的this,只会就近(这个就近是声明位置的就近)取,所以一直是window。

第一个fn是作为函数来调用的,他的this为window
第二个this是function(fn){}的arguments对象,具有arguments具有是具有length的伪数组,这是为什么是输出是2呢,是因为obj.metnod(fn,1) 你传入了2个参数.
第三个是this 指向 obj

以前我刚学js的时候在慕课网上,老师就说this的问题。
this就是函数作为方法被调用时,所处的对象。
不知道理解有误没。

新手上路,请多包涵

请大声告诉我,正确答案是不是110

推荐问题
宣传栏