在Javascript中使用参数替换局部变量是否有性能损失?

Ste*_*lay 6 javascript variables arguments local-variables minify

编写函数是否会影响本地var语句被参数替换?例:

function howManyMatch(arr, pattern, /*ignored:*/ i, l, total) {
  l = arr.length;
  total = 0;
  for (i = 0, i < l; i++) {
    if (pattern.test(arr[i]))
      total++;
  return total;
}
Run Code Online (Sandbox Code Playgroud)

一些优点:

  • 较小的缩小尺寸:没有var陈述;
  • 程序员少花的时间试图用尽可能少varS作为可能的
  • 在一个地方定义的所有本地变量

...和缺点:

  • arguments可以以意想不到的方式改变.见下文
  • 身体不太明显,变量是本地的
  • 混淆看到没有做任何事情的论据
  • 如果有人在不知不觉中删除它们,您的代码会写入全局变量

仍然可能是一个简单的方法让minifier自动挤出更多的位.

更新:目前尚未提及的一大缺点:如果使用N个参数调用函数,则前N个项arguments将绑定到参数列表中的前N个标识符(请参阅10.1.8中最后一个项目符号).考虑一下:

function processStuff(/*ignored:*/i, j, k) {
    // use i/j/k to loop
    // do stuff with the arguments pseudo-array
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子,如果你叫processStuff(stuff1, stuff2),设置ij将覆盖arguments[0]arguments[1]分别.

Pet*_*ley 5

不,不要这样做.这是令人困惑和不必要的.而且我发现你的"优势"清单非常似是而非 - 那里的每个项目都非常薄,以获得实际的收益.

如果必须,只需使用逗号运算符并在函数开头的单个语句中声明所有变量(无论如何它们都被提升到这个位置.

function howManyMatch(arr, pattern) {
  var i, l, total;
  // rest
}
Run Code Online (Sandbox Code Playgroud)

或者您也可以一次性声明/定义所有步骤

function howManyMatch(arr, pattern) {
  var l = arr.length, total = 0, i = 0;
  // rest
}
Run Code Online (Sandbox Code Playgroud)


CMS*_*CMS 4

由于您已经知道的许多原因,我不会这样做,就我个人而言,我不喜欢混合参数与变量的语义,尽管在实现级别,当执行函数时,它们只是属性当前变量对象的,它们具有不同的含义IMO。

现在,回答这个问题,我认为这不会对性能产生任何影响

先说一下变量实例化的过程,它发生在函数代码中,就在函数执行之前(俗称“提升”),首先,函数描述的所有形都绑定到当前的变量对象(当前范围),并且它们使用函数调用中传递的值或未undefined提供的值进行初始化。

之后,属于var函数内所有语句的所有标识符都在当前作用域中声明,并初始化为undefined(请注意,赋值是在此之后进行的,函数体实际上尚未执行)。

第三步是FunctionDeclarations,所有函数声明的标识符都绑定到局部作用域,如果先前声明了标识符,则其值被替换,例如:

(function (a) {
  return typeof a; // "function", not "string"

  function a () {}

})('foo');  // <-- passing a string
Run Code Online (Sandbox Code Playgroud)

我建议在var函数顶部简单地使用一条语句:

function howManyMatch(arr, pattern) {
  var l = arr.length,
      total = 0, i;
  for (i = 0, i < l; i++) {
    if pattern.test(arr[i]) && total++;
  return total;
}
Run Code Online (Sandbox Code Playgroud)

这不仅可以组织您的代码,还可以帮助您防止由于 JavaScript 的纯函数范围和 的“提升”性质而出现不需要的结果var,一些工具(如JSLint)也鼓励这样做。