javascript - f(arguments) 和 f.apply(this,arguments) 有什么区别?

标签 javascript decorator

很久没有学习JavaScript了,现在正在尝试实现Decorator模式:

function wrap(f, before, after){
        return function(){
            return before + f(arguments) + after;
        }
}

我想知道的是,如果我们将 f(arguments) 替换为 f.apply(this,arguments),则输出没有明显差异。 您能否说明哪种情况更可取,为什么?

更新: 我想我已经明白瓶颈是什么了:) 如果我们用前面提到的不带参数的代码装饰函数,一切都会好起来的。但是如果我们有参数,我们将不得不像 arguments[0],arguments[1] 等那样枚举它们。我说得对吗?

最佳答案

  1. f(arguments)只需调用 f并将类似数组的对象(包含参数)传递给它,这不是您想要的。

  2. f.call(this, arguments[0], arguments[1], ..)将要求您列出每个参数,它与 f(arguments[0], arguments[1], ..) 几乎相同, 减去函数上下文。

  3. f.apply(this, arguments)会调用f并在 arguments 中传递每个参数作为实参。

如果您尝试实现一个包装函数而不必考虑将哪些参数传递给f,那么方法#3 就是您想要的。 .

了解有关 Function 方法的更多信息:

关于javascript - f(arguments) 和 f.apply(this,arguments) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23254225/

相关文章:

javascript - 如何将值 "auto"添加到 div?Jquery

javascript - 在按钮上单击显示单选按钮值在更改单选值时不起作用

python - 装饰器如何与 python 中的类一起工作

java - 幕后的外观和构建器模式

python - 是否可以将我自己的装饰器应用于 Python 中的内置方法?

javascript - 在 MarkLogic 数据中心协调 header 插件中运行 Xpath 时出错

javascript - 在 HTML5 Canvas 中绘制对象的高效方法

javascript - 剪切元素 - JQuery

python - 创建一个线程安全的装饰器类

dependency-injection - Angular 2 - 将依赖项注入(inject)装饰器工厂