我有一段代码接受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
时,我们会使用fn
和this/context
方法。
但是fn.apply(fn, [])
在这做什么?困惑是为什么我不能做
obj["name"] = fn();
答案 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
等于函数本身,而不是全局上下文。