回答

收藏

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

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

ECMAScript 6 引入了let语句。我听说它被描述为一个local变量,但我仍然不确定它的行为和var关键词有什么区别?/ i5 P1 y& X& y$ E# q
有什么区别?。什么时候该?let用var?7 _" N+ n2 A( ^1 ]" O
                                                               
1 A* B: \7 s/ u1 \& Z2 [! @    解决方案:                                                               
% e- {+ {' W- U: u) y. [9 }, j* Z                                                                主要区别在于范围规则。var直接函数体(因此是函数作用域)是关键字声明的变量的作用域let变量的作用域是直接表示的封闭块{ }(因此是块作用域)。  A5 f2 j9 T, w% }4 I: w4 f% i
    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();, f) ]( ?, i) P+ i- ]
将let关键词引入语言的原因是函数范围混乱, JavaScript 错误的主要来源之一。
, B, }' D6 Y1 `8 X/ h' I3 x$ v查看此示例:
5 T" I" Y% ?$ [- J3 N+ w6 A, a

    7 x& r8 H" @% l7 c; N, W) C1 X, U
  • var funcs = ;// let's create 3 functionsfor (var i = 0; i My value: 3每次funcs[j]();由于匿名函数绑定到相同的变量,在调用时输出到控制台。
    " H4 J+ n9 ~; }( ^8 w
  • 人们必须创建立即调用的函数来捕获循环中的正确值,但这也很麻烦。
    4 [) D( A; G' J. k1 @" d
  • Hoisting虽然用var关键字声明的变量被hoisted(undefined在代码运行前使用初始化),这意味着它们甚至可以在声明前访问其封闭范围:[code]function run() {  console.log(foo); // undefined  var foo = "Foo";  console.log(foo); // Foo}run();+ [, O* F$ J' _4 T9 ]/ _( l
let在其定义被评估之前,变量不会初始化。在初始化之前访问它们会导致它们ReferenceError. 从块的开始到处理的初始化,变量被称为时间死区。
, e2 F& z0 t9 L" A6 i: J: h3 y
    function checkHoisting() {  console.log(foo); // ReferenceError  let foo = "Foo";  console.log(foo); // Foo}checkHoisting();; l- v; ?5 o( s/ d: ]& {* x: \
创建全局对象属性在顶层let,与 不同var,属性不会在全局对象上创建:
3 o* Q$ }9 Z- g" v! ~+ o9 j/ r
    var foo = "Foo";  // globally scopedlet bar = "Bar"; // not allowed to be globally scopedconsole.log(window.foo); // Fooconsole.log(window.bar); // undefined! v- s" R4 L( X4 q0 p, X
Redeclaration在严格的模式下,var同时,它将允许您在同一范围内重新声明相同的变量let引发 SyntaxError。
6 h6 H. i- K/ y" j2 y4 a8 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
    1 C, Y" V. s$ a8 [
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则