为啥 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 需要以“;”开头?的主要内容,如果未能解决你的问题,请参考以下文章