在几个JavaScript库中,我在一开始就看到了这种符号:
/**
* Library XYZ
*/
;(function () {
// ... and so on
Run Code Online (Sandbox Code Playgroud)
虽然我对"立即执行的函数"语法非常满意
(function(){...})()
Run Code Online (Sandbox Code Playgroud)
我想知道领先的分号是什么.我能想到的是,它是一种保险.也就是说,如果库嵌入在其他有缺陷的代码中,那么它就是"最后一个语句在最后结束"的速度缓冲.
它有任何其他功能吗?
在许多情况下,如果您将它们遗漏,JavaScript解析器将为您插入分号.我的问题是,你把它们遗弃了吗?
如果您不熟悉规则,则会在Mozilla网站上对分号插入进行描述.这是关键点:
如果第一至第n 个 JavaScript程序形式的令牌是语法上有效,但第一至第n + 1个ST令牌是不与存在n之间的换行符个令牌和第n + 1个ST令牌,则解析器尝试将所述n之间的虚拟分号令牌之后再次解析程序次和第n + 1个ST令牌.
这种描述可能不完整,因为它没有解释@ Dreas的例子.任何人都有完整规则的链接,或者看看为什么这个例子得到一个分号?(我在JScript.NET中尝试过.)
此stackoverflow问题是相关的,但仅涉及特定方案.
;(function ($, window, document, undefined) {
//code
}(jQuery, this, this.document));
Run Code Online (Sandbox Code Playgroud)
这是我第一次看到这样的东西.它是什么以及如何解释?我不明白为什么它必须传递this和this.document,以及'undefined'是什么.
我问的原因是因为我把它包含在我的页面中
if($('ul.mtree').length)
Run Code Online (Sandbox Code Playgroud)
返回false,尽管它在控制台中输入时返回true.
我;在一些jQuery插件源代码的函数开头看到了一些奇怪的东西,如下所示:
;(function ($) {.....
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么他们需要;在这种情况下使用?