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),设置i和j将覆盖arguments[0]和arguments[1]分别.
不,不要这样做.这是令人困惑和不必要的.而且我发现你的"优势"清单非常似是而非 - 那里的每个项目都非常薄,以获得实际的收益.
如果必须,只需使用逗号运算符并在函数开头的单个语句中声明所有变量(无论如何它们都被提升到这个位置.
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)
由于您已经知道的许多原因,我不会这样做,就我个人而言,我不喜欢混合参数与变量的语义,尽管在实现级别,当执行函数时,它们只是属性当前变量对象的,它们具有不同的含义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)也鼓励这样做。
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |