为什么 Bootstrap 的 js 源码不写分号?

看了很多 Bootstrap 源码,发现每句话都不加分号,这样写有什么特殊意义么?随便贴一段:

Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.attr('data-target')
    if (!selector) {
        selector = $this.attr('href')
        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    }
    if ($this.parent('li').hasClass('active')) return
    var previous = $ul.find('.active:last a')[0]
    var e        = $.Event('show.bs.tab', {
        relatedTarget: previous
    })
    $this.trigger(e)
    if (e.isDefaultPrevented()) return
    var $target = $(selector)
    this.activate($this.parent('li'), $ul)
    this.activate($target, $target.parent(), function () {
        $this.trigger({
        type: 'shown.bs.tab'
        , relatedTarget: previous
        })
    })
}
阅读 11.8k
评论
    10 个回答
    • 3.2k

    js语法本身是需要使用分号来结束语句的。但js解释器具备 分号自动插入(Automatic Semicolon Insertion) 的能力。这大概是 JavaScript 里最受争议的特性之一吧。
    据说js的作者被C等语言弄烦了,所以就给js增加了这一特性,允许你在js代码的某些部分省略分号,而在解释器层面自动加入。
    由于js的分号自动插入规则是面向解析器、从语法解析的角度(通过js代码文本逆推出语法树的过程)去定义的,所以我们从常规理解js代码角度(根据js语法编写代码)去看会发现其规则非常纠结,展开讲会很头疼(以我的表述能力来说)于是我不多废话了。

    简单的就其一般形式而言,语句结束后换行,或者直接闭合代码块(比如函数代码体的结束}符号),就能激活分号自动插入特性。

    在实际应用中,加不加分号以个人爱好而定。我个人是基于“既然js规范定义了分号自动插入特性那么我就使用吧”这一脑洞想法成为了不加分号党。当然也是希望通过这些细节在具体代码编写加深自己对js基础的巩固,毕竟我是非专业的。

    但需要注意的是,某些不完善的js压缩、合并、混淆工具可能无法正确地应对这一特性,在处理代码时会破坏分号自动插入的条件,也不具备主动插入分号的能力,从而导致生成的代码报错。

    如果会遇到上述问题并不知道如何解决的话,还是建议优先采取手动插入分号的形式。
    当然也有不少折中的写法,就是在代码块的最后一句省略分号,但其它位置都手动添加分号,比如如下形式:

    function a() {
        var b = 1;
        alert(b)
    }
    
      相似问题
      推荐文章