ECMAScript 6 引入了let语句。我听说它被描述为一个local变量,但我仍然不确定它的行为和var关键词有什么区别?( N ]' y& d! p& {- O
有什么区别?。什么时候该?let用var?# w% C6 i# k; X( V
' @' G0 k: D& h4 d w' m1 g 解决方案: 2 ^ B( n, T2 C2 A
主要区别在于范围规则。var直接函数体(因此是函数作用域)是关键字声明的变量的作用域let变量的作用域是直接表示的封闭块{ }(因此是块作用域)。 * c* I" E5 K- C) p& w
function run() { var foo = "Foo"; let bar = "Bar"; console.log(foo,bar); // Foo Bar { var moo = "Mooo" let baz = "Bazz"; console.log(moo,baz); // Mooo Bazz } console.log(moo); // Mooo console.log(baz); // ReferenceError}run();- o2 A( p; e8 O4 V1 p1 O; p% o
let在其定义被评估之前,变量不会初始化。在初始化之前访问它们会导致它们ReferenceError. 从块的开始到处理的初始化,变量被称为时间死区。5 s# V/ H: v$ Y% o4 g
function checkHoisting() { console.log(foo); // ReferenceError let foo = "Foo"; console.log(foo); // Foo}checkHoisting();. U8 Q6 X A9 e" c
创建全局对象属性在顶层let,与 不同var,属性不会在全局对象上创建: # x1 ^! {% w, C
var foo = "Foo"; // globally scopedlet bar = "Bar"; // not allowed to be globally scopedconsole.log(window.foo); // Fooconsole.log(window.bar); // undefined 4 p7 ` e# U# w4 E4 X' i. v* {
Redeclaration在严格的模式下,var同时,它将允许您在同一范围内重新声明相同的变量let引发 SyntaxError。5 ?( G! M+ d4 p5 o; f! T
'use strict';var foo = "foo1";var foo = "foo2"; // No problem,'foo1' is replaced with 'foo2'.let bar = "bar1"; let bar = "bar2"; // SyntaxError: Identifier 'bar' has already been declared 9 v) L) {, h! ]% J