JavaScript中的apply在这里到底修正了什么

var getSingle = function(fn) {
    var result = null;
    return function() {
        return result || (result = fn.apply(this, arguments)); // 这行
    }
}

// 使用
var foo = getSingle(function(){
 // do...
})

foo()

这个单例的代码中。(result = fn.apply(this, arguments)) 改成 result = fn()是不是也行?为什么一定要用apply修正一下this呢?感觉这里的this即使不修正,也是指向宿主window

麻烦大佬们帮忙指导下,谢谢。

阅读 2.2k
3 个回答

没有上下文,没太明白这边在干嘛。但应该不是楼上回答说的那样,函数getSingle的返回值是一个非箭头函数,所以这个返回值中的this在调用时才会确定,而并不一定是window或某个对象,但如果这边不applycall,直接fn()的话是必然会丢失this的指向的,即会指向默认的window

这里的apply是为了将arguments“打散”传入fn,比如:

function fn(a, b) {
    console.log(a, b);
}
fn.apply(this, [1,2]);

上面运行结果打印1 2,apply将[1, 2]“打散”成了两个实参。

而且所给的this是指向内部的函数,不是window。

你这种情况下apply是没啥用的 fn的指向永远是getSingle的上下文

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