回答

收藏

使用“let”和“var”有什么区别?

技术问答 技术问答 290 人阅读 | 0 人回复 | 2023-09-11

ECMAScript 6 引入了let语句。我听说它被描述为一个local变量,但我仍然不确定它的行为和var关键词有什么区别?
4 K0 `7 R6 Q2 U0 Y, w2 m有什么区别?。什么时候该?let用var?
& f( n  j8 Y! x- b" I2 `$ L( j( P                                                               
0 ?5 E8 z; ?4 W    解决方案:                                                                $ c) H3 Q) A2 c& d, t* @5 w; W
                                                                主要区别在于范围规则。var直接函数体(因此是函数作用域)是关键字声明的变量的作用域let变量的作用域是直接表示的封闭块{ }(因此是块作用域)。
! }. T! _1 H* I7 y; g
    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();9 N1 o2 |$ O1 S$ a+ L
将let关键词引入语言的原因是函数范围混乱, JavaScript 错误的主要来源之一。
! j) f2 r8 K3 R. E: D查看此示例:& ~$ E% M7 t7 M$ x2 p
    " B2 }( E5 o9 P2 \: O
  • var funcs = ;// let's create 3 functionsfor (var i = 0; i My value: 3每次funcs[j]();由于匿名函数绑定到相同的变量,在调用时输出到控制台。0 K) }" q+ L2 Q4 N
  • 人们必须创建立即调用的函数来捕获循环中的正确值,但这也很麻烦。
    ! T# g7 K! p8 P
  • Hoisting虽然用var关键字声明的变量被hoisted(undefined在代码运行前使用初始化),这意味着它们甚至可以在声明前访问其封闭范围:[code]function run() {  console.log(foo); // undefined  var foo = "Foo";  console.log(foo); // Foo}run();
    * c# r* s' d0 a0 D+ c; k  g
let在其定义被评估之前,变量不会初始化。在初始化之前访问它们会导致它们ReferenceError. 从块的开始到处理的初始化,变量被称为时间死区。) q& ]9 l3 B- K8 ?' N0 d/ }
    function checkHoisting() {  console.log(foo); // ReferenceError  let foo = "Foo";  console.log(foo); // Foo}checkHoisting();# P, m: Z! u' U3 G0 `( d' b
创建全局对象属性在顶层let,与 不同var,属性不会在全局对象上创建:
# Y( ^2 E4 n; N$ A2 c. `5 \
    var foo = "Foo";  // globally scopedlet bar = "Bar"; // not allowed to be globally scopedconsole.log(window.foo); // Fooconsole.log(window.bar); // undefined
    + z. i8 I8 ^6 J6 }2 r( L7 d: J
Redeclaration在严格的模式下,var同时,它将允许您在同一范围内重新声明相同的变量let引发 SyntaxError。. ], D& F) D4 O
    '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
    5 r" a$ O' X( P" ?  k8 S* r* I/ ?
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则