我有什么理由不会使用"让"?

时间:2015-05-13 09:36:10

标签: javascript const var ecmascript-6 let

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

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

3 个答案:

答案 0 :(得分:2)

因为es5只有变量的函数范围,所以你的转换器可能是为了模拟let关键字的功能而创建闭包。如果您在非函数范围内声明变量(例如循环,ifs等),则可能会影响代码的结果大小。所以这是目前没有的一个原因。它也可能使调试稍微混乱,尽管可以使用源映射来缓解这种情况。

还有其他任何缺点。对于来自其他语言的人来说,可变提升非常令人困惑,使用let可以避免这种潜在的打嗝。所以如果可以,我现在就用它。

答案 1 :(得分:0)

这取决于您的环境:

  • 如果您正在编写服务器端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

答案 2 :(得分:0)

有时,let不允许指定的功能提升模式。它在Chrome 51中有效,但在Safari 9.1.1中没有。因此,

let foo = func;

function func () {
    return true;
}

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

var foo = func;

function func () {
    return true;
}

根据您的目的,这可能会使您的代码具有或多或少的可读性。例如,曝光模块模式具有大量初始化代码,因此不会立即返回。

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