首页 文章

为什么JavaScript需要以“;”开头?

提问于
浏览
216

我最近注意到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文件中看到了这种约定 .

这样做的优点和缺点是什么?

3 回答

  • 350

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

  • 12

    我会说,因为脚本经常连接和缩小/压缩/一起发送,所以最后一个人有可能有这样的事情:

    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
    
  • 56

    考虑这个例子:

    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

相关问题