为啥 JavaScript 需要以“;”开头?

Posted

技术标签:

【中文标题】为啥 JavaScript 需要以“;”开头?【英文标题】:Why does the JavaScript need to start with ";"?为什么 JavaScript 需要以“;”开头? 【发布时间】:2011-01-29 16:57:57 【问题描述】:

我最近注意到 Web 上的许多 javascript 文件都以; 开头,紧跟在评论部分之后。

例如,this jQuery plugin's 代码以:

/**
 * jQuery.ScrollTo
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 9/11/2008                                      
 .... skipping several lines for brevity...
 *
 * @desc Scroll on both axes, to different values
 * @example $('div').scrollTo(  top: 300, left:'+=200' ,  axis:'xy', offset:-20  );
 */
;(function( $ )

为什么文件需要以; 开头?我在服务器端 JavaScript 文件中也看到了这种约定。

这样做有什么好处和坏处?

【问题讨论】:

【参考方案1】:

我相信(虽然我不确定,所以请不要攻击我)这将确保关闭来自不同文件的任何先前声明。在最坏的情况下,这将是一个空语句,但在最好的情况下,当未完成的语句实际上来自上面时,它可以避免尝试在此文件中追踪错误。

【讨论】:

我不是 100% 确定,但我支持你,杰瑞。【参考方案2】:

我会说,由于脚本经常被连接和缩小/压缩/发送在一起,最后一个人有可能有类似的东西:

return 
   'var':'value'

在最后一个脚本的末尾没有;。如果你的开头有;,它是安全的,例如:

return 
   'var':'value'

;(function( $ ) //Safe (still, screw you, last guy!)

return 
   'var':'value'

(function( $ ) //Oh crap, closure open, kaboom!

return 
   'var':'value'
;
;(function( $ ) //Extra ;, still safe, no harm

【讨论】:

您实际上不能将return 语句作为脚本中的最后一件事,对吗?回到***水平没有意义。应该是别的吧? @user2357112 更重要的是,代码 after return 语句不会被执行,因此连接没有意义。至少有一个 不见了。【参考方案3】:

考虑这个例子:

function a() 
  /* this is my function a */

a()
(function() 
  /* This is my closure */
)()

会发生什么,它会被这样评估:

function a() 
  /* this is my function a */

a()(function() )()

因此,a 返回的内容将被视为尝试初始化的函数。

这主要是为了防止在尝试将多个文件合并为一个文件时出错:

a.js

function a() 
  /* this is my function a */

a()

b.js

(function() 
  /* This is my closure */
)()

如果我们将这些文件连接在一起会导致问题。

因此请记住将您的; 放在( 前面,也可以放在其他几个位置。顺便提一句。 var a = 1;;;var b = 2;;;;;;;;;var c = a+b; 是完全有效的 JavaScript

【讨论】:

以上是关于为啥 JavaScript 需要以“;”开头?的主要内容,如果未能解决你的问题,请参考以下文章

为啥流行的 JavaScript 运行时不能处理看起来像同步的异步脚本?

为啥我的 ja.lproj 不显示日语?

如何仅删除以“//”开头的 JavaScript 注释?

为啥 KS 曲线以 (0,0) 开头?

为啥包名称通常以“com”开头[重复]

如果整数以前导零开头,为啥 JSON 无效?