JavaScript 传递“;” 作为“for”语句中的第一个参数

Pro*_*ogo 5 javascript

我一直在研究 jQuery 源代码,在检查jQuery.fn.extend函数时我注意到了这一点:

for ( ; i < length; i++ ){
    code
}
Run Code Online (Sandbox Code Playgroud)

为什么;开头有?同样,我注意到一些 javascript 库是这样开头的:

; (function (){ ...
Run Code Online (Sandbox Code Playgroud)

无需任何预先代码。

为什么是这样?这在语法上如何正确?

谢谢你。

elc*_*nrs 5

这两个片段是不相关的。

第一个是空语句。一个for循环需要 3 个语句;如果在循环之前初始化变量,则不需要在内部初始化它,但语句必须在那里,因此是空语句:

var i=0;
for (; i<10; i++) {}
Run Code Online (Sandbox Code Playgroud)

一个典型的例子是for(;;),相同while(true)但更短。

第二段代码是 IIFE(立即调用函数表达式)的开始。开头的分号是为了避免可能缺少分号的其他 JavaScript 文件的连接错误,否则 IIFE 可能会被解释为函数调用,例如:

// file1.js
var f = function(){} // oops
// file2.js
(function(){})();
Run Code Online (Sandbox Code Playgroud)

如果文件确实包含最后一个分号,那么您最终会得到一个空语句,这是可以的。


Tun*_*yaw 5

JavaScriptfor循环有三个可选参数。因此,您可以省略其所有三个参数。

在您的代码中,

for( ; i < length; i++) 
Run Code Online (Sandbox Code Playgroud)

省略第一个参数。;不作为参数传递。;只是一个分隔符。for循环的语法是


for( [optional parameter 1] ; [optional parameter 2] ; [optional parameter 3] )
Run Code Online (Sandbox Code Playgroud)

或者

for ([initialization] ; [condition] ; [final-expression])
Run Code Online (Sandbox Code Playgroud)

所以以下语句在语法上是正确的

for( ; i < length; i ++ )  // first parameter is omitted
for( ; i < length; ) // first and third parameters are omitted
for( ; ; ) // all parameters are omitted
Run Code Online (Sandbox Code Playgroud)