函数中未使用的参数是否会降低JavaScript的执行速度?

函数中未使用的参数是否会降低JavaScript的执行速度?,javascript,performance,optimization,Javascript,Performance,Optimization,javascript函数中有未使用的参数会降低执行速度吗?它占用内存吗?我经常使用从未实际使用过的参数编写函数,例如函数有一个事件作为参数,但该事件从未用于任何事情 放慢执行速度 运行时间取决于对输入执行的操作。可能是搜索、排序或任何简单的操作。操作的运行时间决定其执行速度。因此,当您不传递任何参数时,这意味着没有对该参数执行任何操作,因此运行时间是稳定的 它占用内存吗 但就内存分配而言,它们通常被分配一个内存 当函数运行时,在每次函数调用时,新的 LexicalEnvironment被创建并填

javascript函数中有未使用的参数会降低执行速度吗?它占用内存吗?我经常使用从未实际使用过的参数编写函数,例如函数有一个事件作为参数,但该事件从未用于任何事情

放慢执行速度

运行时间取决于对输入执行的操作。可能是搜索、排序或任何简单的操作。操作的运行时间决定其执行速度。因此,当您不传递任何参数时,这意味着没有对该参数执行任何操作,因此运行时间是稳定的

它占用内存吗

但就内存分配而言,它们通常被分配一个内存

当函数运行时,在每次函数调用时,新的
LexicalEnvironment
被创建并填充参数, 变量和嵌套函数声明

因此,对于以下函数:

function sayHi(name) {
/* LexicalEnvironment = { name: passedvalue, 
                        phrase: undefined }*/  // created at this point.
  var phrase = "Hi, " + name
  alert(phrase)
}
因此,当您将其作为
sayHi()
调用时,词法环境如下所示:

LexicalEnvironment = { name: undefined, phrase: undefined};
因此,当解释器解释函数时,每个参数和函数变量都被分配内存

当解释器准备开始执行功能代码时, 在运行第一行之前,将创建一个空的词典环境 和填充参数、局部变量和嵌套函数


JavaScript无论如何都会将发送到
arguments
数组中每个函数的参数存储起来,而不管您为它们分配了本地变量

function test() {
    console.log(arguments)
}

test('these','are','passed')

//logs ["these','are',passed']
我的观点是,未使用的参数无论如何都会占用内存,您只能使用另一个变量名引用它们

javascript函数中有未使用的参数会降低执行速度吗

在现代引擎中可能不是这样(这是一个微不足道的死代码消除)。无论如何,在堆栈上分配变量是便宜的

它占用内存吗

至少有几个字节用于将函数体保存为字符串

我经常使用从未实际使用过的参数编写函数,例如函数有一个事件作为参数,但该事件从未用于任何事情


如果没有基准测试,你不应该关心微观优化。不要试图胜过编译器,V8和SpiderMonkey在优化代码方面做得很好。

我对这个问题的一个子集感兴趣:生成未使用参数的代码是否经过计算?我的用例用于调试日志消息:当我将日志级别设置为小于“debug”的值时,留在调试代码中是否会降低脚本的速度?我在上运行了基准测试来找出答案。这表明代码经过了评估,确实减慢了脚本的速度

测试描述 准备代码 测试2:有条件地评估 结果 经常评估 36047±1.45%操作/秒

有条件地评估
30326171±5.55%运算/秒

我经常使用从未实际使用过的参数编写函数-为什么?oWell我的意思是,我在编写函数时添加了参数,之后就不需要它们了,但我可能会把它们留在那里。有时,您会有一些示例代码,其中包含不需要的事件或其他参数。我只是想知道是否有必要为了性能而删除这些参数。@Andreas看起来像是在创建DOM事件回调(
addEventHandler
),并在默认情况下将
事件
参数添加到函数中,即使它可能未被使用。很多人都这么做。。。这也意味着参数被传递(并且在
参数
中可用),使得差异比以前更小。删除未使用的参数以保持代码干净是值得的-在函数签名和调用站点中。由于事件处理程序无论如何都会传递一个事件参数,为了清晰起见,您也可以保留这些参数。无论如何,如果性能或内存消耗是一个问题,那么首先确定瓶颈并寻找更好的算法和数据结构。虽然我喜欢你的广泛答案,但我认为它没有抓住问题的关键:性能。@Zeeker,我认为这是不言自明的,如果且仅当对参数执行某些操作时,函数的执行速度才会受到影响。“已更新了我的答案,w.r.t您的评论。@Batshray将函数的参数保留为未使用状态,这是否意味着未对该参数执行任何操作?”?例如,
函数sayHi(woops){console.log(“whats”);}
ifvs nothing中的参数woops。
if
检查将导致减速。
Benchmark.prototype.setup = function() {

  var generate_message = function() {
    // Do some calculations to generate a dummy message.
    var s = ''
    for (var i = 1; i < 512; i++) {
      var a = Math.random()
      var b = Math.random()
      s += String.fromCharCode(48 + Math.floor(128*a*b))
    }
    return s
  }

  var Log = {
    level: 1, /* 1 = FATAL, 4 = DEBUG */
    fatal: function(msg) {this.log(1, msg)},
    debug: function(msg) {this.log(4, msg)},
    log: function(lvl, msg) {
           if (lvl <= this.level) {
             if (typeof msg === 'function') msg = msg()
             console.log([new Date(), lvl, msg].join('::'))
           }
         },
  }

};
Log.debug(generate_message())
Log.debug(generate_message)