回答

收藏

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

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

ECMAScript 6 引入了let语句。我听说它被描述为一个local变量,但我仍然不确定它的行为和var关键词有什么区别?, `+ ?' U+ ^% J
有什么区别?。什么时候该?let用var?1 }  U! m4 q, J, J: x
                                                               
6 k3 n, Z* ]- E) i% c) F0 `8 i0 r- h; {    解决方案:                                                               
/ e6 F7 L% U- o- y                                                                主要区别在于范围规则。var直接函数体(因此是函数作用域)是关键字声明的变量的作用域let变量的作用域是直接表示的封闭块{ }(因此是块作用域)。
$ n) h% G9 y$ S: J. Q8 T
    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();
    % `+ l! ~# e6 f
将let关键词引入语言的原因是函数范围混乱, JavaScript 错误的主要来源之一。
- u- U' V! v$ j, Q查看此示例:3 J) g: x8 N# Q/ A3 d8 H0 r

    3 J# b9 m: Y6 Y$ y
  • var funcs = ;// let's create 3 functionsfor (var i = 0; i My value: 3每次funcs[j]();由于匿名函数绑定到相同的变量,在调用时输出到控制台。! `9 f, v1 ?* X4 Y2 u1 \3 j% S8 [
  • 人们必须创建立即调用的函数来捕获循环中的正确值,但这也很麻烦。
    ; Z7 P* H; ?: Y( J4 Z+ o: O
  • Hoisting虽然用var关键字声明的变量被hoisted(undefined在代码运行前使用初始化),这意味着它们甚至可以在声明前访问其封闭范围:[code]function run() {  console.log(foo); // undefined  var foo = "Foo";  console.log(foo); // Foo}run();
    4 _9 ^2 |7 l7 V* h/ g& {
let在其定义被评估之前,变量不会初始化。在初始化之前访问它们会导致它们ReferenceError. 从块的开始到处理的初始化,变量被称为时间死区。5 z" [/ M( f/ X. ~4 j
    function checkHoisting() {  console.log(foo); // ReferenceError  let foo = "Foo";  console.log(foo); // Foo}checkHoisting();
    ! h7 e* c# E! h
创建全局对象属性在顶层let,与 不同var,属性不会在全局对象上创建:2 O& q. N; M/ G) L, b" S
    var foo = "Foo";  // globally scopedlet bar = "Bar"; // not allowed to be globally scopedconsole.log(window.foo); // Fooconsole.log(window.bar); // undefined
    4 L/ c5 A6 l; j$ U3 C5 i6 h
Redeclaration在严格的模式下,var同时,它将允许您在同一范围内重新声明相同的变量let引发 SyntaxError。
  u. B% E# G& G* L/ a
    '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
    : Z; W, k  {; D3 i' u* g
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则