回答

收藏

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

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

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关键词引入语言的原因是函数范围混乱, JavaScript 错误的主要来源之一。. G# `6 X4 S1 a0 I; M1 }
查看此示例:
. O+ G! @! i0 J
    ( b9 e& j+ h4 {6 D  E) U
  • var funcs = ;// let's create 3 functionsfor (var i = 0; i My value: 3每次funcs[j]();由于匿名函数绑定到相同的变量,在调用时输出到控制台。  y% W  O0 \- y
  • 人们必须创建立即调用的函数来捕获循环中的正确值,但这也很麻烦。
    , P0 g7 U2 W6 g
  • Hoisting虽然用var关键字声明的变量被hoisted(undefined在代码运行前使用初始化),这意味着它们甚至可以在声明前访问其封闭范围:[code]function run() {  console.log(foo); // undefined  var foo = "Foo";  console.log(foo); // Foo}run();
    % B; \1 p7 w: I7 r/ ?
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
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则