js this问题

var length = 20;
function fn(){
    console.log(this.length);
}
var obj = {
    length : 10,
    api : function(fn){
        fn();
        arguments[0]();
    }
}
obj.api(fn,2)

为何fn()输出的是20,argument[0]()输出的是2;

fn()的当前上下文不是obj.api吗?

阅读 2.5k
4 个回答

fn() 其实是等于 window.fn() 的,arguments 此时是一个对象了 {0 : fn,1:2}

通常来说,以 A.B() 或 A[B]() 的方式调用 B ,那么在 B 函数中, this 是 A。

以 B() 的方式调用,严格模式下没有 this 。非严格模式下 this 是全局环境。

到你这里,子啊 obj.api() 的函数体里, this 是 obj 。但是,由于通过 fn() 的方式调用 fn() ,在该次调用中, fn 中 this 是全局环境,输出全局变量 length ,也就是 20。

通过 arguments[0]() 的方式调用 fn() ,fn 中 this 是 arguments , fn() 中的 this.length 是 arguments.length ,也就是 2。

fn 的两次执行 this 都不是 obj,更不可能是你说的 obj.api,具体自己去百度 javascript this 的指向

fn() 属于函数的直接调用这种情况。
arguments[0]() 属于调用 arguments{0: fn, 1: 2}的方法,this 为 arguments。

js中的this指向一开始确实不好理解, 有点儿耐心, 慢慢就理解了。 其实这个题记住两点就行了

  1. js中function的this指向是函数执行时的this 而不是定义时的this。什么意思呢? 就是你写一个函数, 内部有this。如果这个函数不执行,是无法确切知道this指向谁的。只有看这个函数在哪里执行,才能确定this指向谁。
  2. 比如上面的fn();像这种fn()这种写法的this指向一般都是谁调用这个函数,this就指向谁。比如fn()这个。其实window在调用它。所以此时fn里的this指向window。内部输出this.length . 肯定是输出length这个变量。arguments同理。

其实js里this的指向也就4到5种 记熟它就可以了 这是我以前写的博客 你可以看看
https://blog.csdn.net/QingWaX...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题