Javascript - 方法链上的缩进是否会导致分号出现问题?

时间:2014-12-02 15:29:37

标签: javascript

来自JSLint.com

  

JavaScript使用类似C的语法,需要使用分号来分隔某些语句。 JavaScript尝试使用分号插入机制使这些分号可选。这很危险,因为它可以掩盖错误。

     

与C类似,JavaScript有++和 - 和(可以是前缀或后缀的运算符。消歧由分号完成。

     

在JavaScript中,换行符可以是空格,也可以作为分号。这取代了另一个模糊性。

     

JSLint希望每个语句都遵循;除了for,function,if,switch,try和while。 JSLint不希望看到不必要的分号或空语句。

一个好的做法是:

var one = 'something';
var two = 'other thing';

VS

var one = 'something'
  , two = 'other thing';

当谈到方法链时,Air BnB's Style Guide - under the Whitespace Section建议对方法链使用缩进。

// bad
$('#items').find('.selected').highlight().end().find('.open').updateCount();

// good
$('#items')
  .find('.selected')
    .highlight()
    .end()
  .find('.open')
    .updateCount();

// bad
var leds = stage.selectAll('.led').data(data).enter().append('svg:svg').class('led', true)
    .attr('width',  (radius + margin) * 2).append('svg:g')
    .attr('transform', 'translate(' + (radius + margin) + ',' + (radius + margin) + ')')
    .call(tron.led);

// good
var leds = stage.selectAll('.led')
    .data(data)
  .enter().append('svg:svg')
    .class('led', true)
    .attr('width',  (radius + margin) * 2)
  .append('svg:g')
    .attr('transform', 'translate(' + (radius + margin) + ',' + (radius + margin) + ')')
    .call(tron.led);

当Javascript插入分号时,这种缩进会导致问题吗?

2 个答案:

答案 0 :(得分:2)

没有。由于有效语句在具有链式方法的以下行上继续,因此忽略缩进并且换行也是如此。

JavaScript的自动分号插入有点复杂,但在很大程度上非常直观。

人们遇到的问题是,可以解释为后缀运算符的运算符会启动前一个语句未终止的行。你的代码都没有遇到这个问题。

只要您在这种情况下不忘记分号:

// forgot--v
var a = "b" 

(function() {
    // do some stuff
})();

或者这个:

// forgot--v
var a = "b"

[1,2,3].forEach(function(n) {
    // do something
});
你会没事的。

return声明之后,可能是知道换行符的最大位置。

return
{
    foo: "bar"
}

这将为您提供undefined返回值,而不是对象。

特别是,我更喜欢这种形式的变量声明:

var one = 'something'
  , two = 'other thing';

虽然我将,放在v下面而不是r(真的不重要)。当有很长的变量列表时,很容易看出你已经记住了所有的逗号。这是非常安全的WRT分号插入。

答案 1 :(得分:0)

没有;缩进不是JS语法的一部分。

请不要依赖分号缩进。

(不相关,但我不喜欢这样的缩进;我更喜欢将它们放在同一列上。也就是说,当end()被使用时,你的jQuery示例似乎是有道理,所以我可能不得不重新考虑。)