我有什么理由不使用 "let"?
Is there any reason I wouldn't use "let"?
现在我们可以编写 ES6 并将其部署到浏览器(使用 Traceur 或 6to5 来支持遗留用户代理),我们有什么理由不使用 let
或 const
作为我们用于变量声明的默认关键字?
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.
现在我们可以编写 ES6 并将其部署到浏览器(使用 Traceur 或 6to5 来支持遗留用户代理),我们有什么理由不使用 let
或 const
作为我们用于变量声明的默认关键字?
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.