我很久没学过JavaScript了,现在我试图实现Decorator模式:
function wrap(f, before, after){
return function(){
return before + f(arguments) + after;
}
}
我想知道的是,如果我们将f(arguments)
替换为f.apply(this,arguments)
,则输出没有明显差异。
您能否澄清一下哪个案例更可取?为什么?
UPD:
我想我已经明白了什么是瓶颈:)
如果我们用前面的代码装饰函数而没有参数,一切都会好的。但是如果我们有参数,我们就必须像arguments[0],arguments[1]
那样列举它们。我是对的吗?
答案 0 :(得分:2)
f(arguments)
只需调用f
并将 Array 类对象(包含参数)传递给它,这是不你想要的。
f.call(this, arguments[0], arguments[1], ..)
会要求您列出每个参数,它与f(arguments[0], arguments[1], ..)
几乎相同,减去函数上下文。
f.apply(this, arguments)
会调用f
并将arguments
中的每个参数作为实际参数传递。
如果您正在尝试实现包装函数而不必考虑将哪些参数传递到f
,那么方法#3就是您想要的。
详细了解功能的方法:
call()
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call apply()
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply arguments
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/arguments