ECMAScript 6 引入 了 let
语句。
我听说它被描述为一个局部变量,但我仍然不太确定它与 var 关键字的行为有何不同。
有什么区别?什么时候应该用 let
代替 var
?
原文由 TM. 发布,翻译遵循 CC BY-SA 4.0 许可协议
ECMAScript 6 引入 了 let
语句。
我听说它被描述为一个局部变量,但我仍然不太确定它与 var 关键字的行为有何不同。
有什么区别?什么时候应该用 let
代替 var
?
原文由 TM. 发布,翻译遵循 CC BY-SA 4.0 许可协议
let
也可用于避免闭包问题。它绑定新值而不是保留旧引用,如下面的示例所示。
for(var i=1; i<6; i++) {
$("#div" + i).click(function () { console.log(i); });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Clicking on each number will log to console:</p>
<div id="div1">1</div>
<div id="div2">2</div>
<div id="div3">3</div>
<div id="div4">4</div>
<div id="div5">5</div>
上面的代码演示了一个经典的 JavaScript 闭包问题。对 i
变量的引用存储在单击处理程序闭包中,而不是 i
的实际值。
每个单击处理程序都将引用同一个对象,因为只有一个计数器对象包含 6 个,因此每次单击都会得到 6 个。
一般的解决方法是将其包装在匿名函数中并将 i
作为参数传递。现在也可以通过使用 let
代替 var
来避免此类问题,如下面的代码所示。
(在 Chrome 和 Firefox 50 中测试)
for(let i=1; i<6; i++) {
$("#div" + i).click(function () { console.log(i); });
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p>Clicking on each number will log to console:</p>
<div id="div1">1</div>
<div id="div2">2</div>
<div id="div3">3</div>
<div id="div4">4</div>
<div id="div5">5</div>
原文由 Gurpreet Singh 发布,翻译遵循 CC BY-SA 4.0 许可协议
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
范围规则
主要区别在于范围规则。由
var
关键字声明的变量的作用域是直接函数体(因此是函数作用域),而let
变量的作用域是由{ }
表示的直接 封闭 块(因此是块作用域)。将
let
关键字引入语言的原因是函数范围令人困惑,并且是 JavaScript 中错误的主要来源之一。从 另一个 Stack Overflow 问题 看一下这个例子:
My value: 3
每次funcs[j]();
被调用是因为匿名函数绑定到同一个变量。人们必须创建立即调用的函数来从循环中捕获正确的值,但这也很麻烦。
吊装
虽然使用
var
关键字声明的变量被 提升(在代码运行之前使用undefined
初始化),这意味着它们甚至在声明之前就可以在其封闭范围内访问:let
变量在它们的定义被评估之前不会被初始化。在初始化之前访问它们会导致ReferenceError
。从块的开始到处理初始化,该变量被称为处于“临时死区”。创建全局对象属性
在顶层,
let
与var
不同,不会在全局对象上创建属性:重新声明
在严格模式下,
var
将允许您在同一范围内重新声明相同的变量,而let
会引发 SyntaxError。