fn.apply(fn,[])做了什么?

时间:2014-12-05 19:21:28

标签: javascript

我有一段代码接受fn作为参数并将其存储在object属性中。

var obj = {};

function anotherFn(fn){
   obj["name"] = fn.apply(fn, []);
}

function google(){
    console.log("hello");
}
anotherFn(google);
console.log(obj.name);

我不理解的是fn.apply(fn,[])代码及其目的。通常,当我们要在不同的call中执行apply时,我们会使用fnthis/context方法。

但是fn.apply(fn, [])在这做什么?困惑是为什么我不能做

obj["name"] = fn();

2 个答案:

答案 0 :(得分:6)

fn.apply(fn, [])使用fn的上下文(执行函数时的this的值)调用存储在fn中的函数,以及{{1}中包含的参数(没有参数)。

以这种方式调用[]似乎很奇怪,因为它等同于调用apply

fn.call(fn) 是一个合适的替代品,因为fn()将在全局上下文中执行,这意味着函数中fn()的值将是this(假设是浏览器环境)。

答案 1 :(得分:3)

这是一个受到尊重的样本,展示了它的不同之处:

var obj = {};

function anotherFn(fn){
   obj["name"] = fn.apply(fn, []);
}

function anotherFn2(fn){
   obj["name"] = fn(fn, [])
}

function google() {
    console.log(this.world);
}
google.world = "yay!"

anotherFn(google);
anotherFn2(google);

输出结果为:

yay!
undefined

jsFiddle:http://jsfiddle.net/c56ja3jL/

根据具体情况,这可能会有用。基本思想是你总是this等于函数本身,而不是全局上下文。