我有什么理由不使用 "let"?

Is there any reason I wouldn't use "let"?

现在我们可以编写 ES6 并将其部署到浏览器(使用 Traceur 或 6to5 来支持遗留用户代理),我们有什么理由不使用 letconst 作为我们用于变量声明的默认关键字?

var死了吗?如果是,我可以配置我的 linting 工具来拒绝它吗?

由于 es5 仅具有变量的函数作用域,因此您的转译器可能正在创建闭包以模拟 let 关键字的功能。如果您在非函数范围内声明变量(例如循环、ifs 等),这可能会影响代码的最终大小。所以这是目前不这样做的原因之一。它也可能使调试更加混乱,尽管这可以使用 sourcemaps 来缓解。

确实没有任何其他缺点。变量提升对于来自其他语言的人来说非常混乱,使用 let 可以避免这种潜在的问题。所以如果可以的话我现在就用它。

这取决于你的环境:

  • 如果您正在编写服务器端 JavaScript 代码 (Node.js),您可以安全地使用 let 语句。

  • 如果您正在编写客户端 JavaScript 代码并使用像 Traceur 这样的转译器,您可以安全地使用 let 语句,但是您的代码可能在性能方面绝非最佳。

  • 如果您正在编写客户端 JavaScript 代码并且不使用转译器,则需要考虑浏览器支持。

    今天,2016 年 2 月 23 日,这些是一些不支持 let 或仅部分支持的浏览器:

    • Internet Explorer 10 及以下(不支持)
    • Firefox 43及以下(不支持)
    • Safari 9 及更低版本(不支持)
    • Opera Mini 8及以下(不支持)
    • Android浏览器4及以下(不支持)
    • Opera 36及以下(部分支持)
    • Chome 51及以下(部分支持)

有关在您阅读此答案时哪些浏览器支持 let 语句的最新概述,请参阅 this Can I Use page

有时,let 不允许命名函数提升模式。它在 Chrome 51 中有,但在 Safari 9.1.1 中没有。因此,

let foo = func;

function func () {
    return true;
}

会抛出错误。而以下样式是有效的:

var foo = func;

function func () {
    return true;
}

根据您的目的,这可能会或多或少地提高您的代码的可读性。例如,一个包含大量初始化代码的公开模块模式,因此 return 不会立即出现。

var foo = (function () {
    let factory = {
        func: func
    };

    init();
    // do more init stuff

    return factory;

    function func () {
        //
    }
}());

Using function declarations to hide implementation details, for example.