声明空JavaScript变量的最佳做法

在为其分配值之前,在javascript中声明变量时,是否有最佳做法?有时由于范围原因是必要的,但是如果范围不重要呢?

// Declare first
(function() {
    var foo = 'bar',
        a = 500,
        b = 300,
        c;

    // Some things get done here with a and b before c can use them...

    c = a * b;    

    // c is now ready to use...
    doSomething(c);
}());

// Declare when needed
(function() {
    var foo = 'bar',
        a = 500,
        b = 300;

    // Some things get done here with a and b before c can use them...

    var c = a * b; 

    // c is now ready to use...
    doSomething(c);
}());

而且我也想知道什么是类似于对象文字的最佳实践:

// Add property with null assigned to it
var myObj = {
    foo: null,

    doSomething: function() {
        this.foo = 'bar';
    }
};

// Property gets added when value is set
var myObj = {
    doSomething: function() {
        this.foo = 'bar';
    }
};
最佳答案
这主要是风格的问题。

由于var声明自动为范围顶部的hoisted up,所以将它们置于其范围之上是有意义的,以便您可以阅读更接近解释器执行代码的代码。

声明变量在其范围的顶部是Crockford’s recommendation.它确实有道理,因为它清除了一些常见的误解。

例如:

for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i);
    }, 0);
}

由于var具有函数范围,所以它们之间的所有迭代(和函数)都是相同的。由于所有三个定时功能将在循环结束后执行,上述代码段记录3次。

现在对于那些具有框架界限经验的人来说,上述行为并不是很清楚。重写代码段:

var i;
for (i = 0; i < 3; i++) {
    // ...
}

现在,我在全球范围内宣布,与上一个片段一样。但是,这一点更清楚了。

另一个误解:

(function() {
    if (true) {
        var foo = 1;
    } else {
        var foo = 1;
    }
}());

再次,在范围限定的语言中,上述是完全有效的。但是,由于var声明在解析时被提升到当前函数范围的顶部,所以上面相当于:

(function() {
    var foo;
    var foo;
    if (true) {
        foo = 1;
    } else {
        foo = 1;
    }
}());

该变量声明两次。大多数浏览器将忽略第二个声明,代码将“工作”,但静态代码分析工具(如JSHint)将会对您大喊大叫。

您只需一个声明就可以重写,完全有效:

(function() {
    if (true) {
        var foo = 1;
    } else {
        foo = 1;
    }
}());

但像我这样的类似OCD的编程者会发现它比较丑陋。所以再次宣布:

(function() {
    var foo;
    if (true) {
        foo = 1;
    } else {
        foo = 1;
    }
}());

看起来更加整洁。

再次,这主要是风格的问题。就个人来说,如果我有一个巨大的功能,我讨厌滚动一切,只是为了检查一个变量是否已被声明并将其添加到列表中。在这种情况下,我可以在函数的中间添加几个var声明(反对Crockford的建议),我个人觉得更容易阅读和维护。

由于这是一个风格问题,只需确保您的代码最可维护和简明可行。

在硬币的另一边,我承认,个人来说,我已经开始使用变量首先使用var声明了。这是语言的一个方面,你可以这样使用它没有问题。

但是我也会承认,如果我从一开始就遵循了Crockford的建议,那么我会有更多的头痛(就像上面的误解一样),并且会更快地掌握JavaScript的功能范围。

¹请注意,JS 1.7通过let引入了块范围的变量,但尚未得到广泛的支持。

转载注明原文:声明空JavaScript变量的最佳做法 - 代码日志