深入解析 JavaScript 中的 var、let 和 const

阅读时长 3 分钟读完

在 JavaScript 中,变量的定义有三种方式:var、let 和 const。这三种定义变量的方式有着不同的作用域和可变性,容易造成混淆,本文将介绍 JavaScript 中 var、let 和 const 的不同特点及使用方法。

var

var 是 JavaScript 最初的定义变量的方式,它可以声明全局变量或函数作用域内的变量。var 定义的变量可以重复声明,其作用域为函数作用域或全局作用域。

-- -------------------- ---- -------
-------- ------ -
  --- - - --
  -- ------ -
    --- - - --
    ---------------
  -
  ---------------
-

-------
-- ---------

在上述代码中,虽然在 if 语句块中重新定义了 a,但由于 var 的特性,a 的作用域为函数作用域,所以在 if 语句块外面的 console.log 中也输出了 2。

let

let 是 ES6 新增的定义变量的方式,它定义的变量可以被重新赋值,但不能重复声明,其作用域是块级作用域。

-- -------------------- ---- -------
-------- ------ -
  --- - - --
  -- ------ -
    --- - - --
    ---------------
  -
  ---------------
-

-------
-- ---------

在上述代码中,let 定义的变量 a 在 if 语句块中重新赋值,但由于 let 的特性,a 的作用域不同,在 if 语句块外面的 console.log 中输出了 1。

const

const 也是 ES6 新增的定义变量的方式,它定义的变量不能被重新赋值和重复声明,也是块级作用域。

-- -------------------- ---- -------
-------- ------ -
  ----- - - --
  -- ------ -
    -- ----- - - -- -- -------- --
    ---------------
  -
  ---------------
-

-------
-- ---------

在上述代码中,const 定义的变量 a 不能被重新赋值,因此注释掉的 const a = 2; 代码会报错,而且 const 定义的变量也不能重复声明。

总结

在实际开发中,建议优先使用 let 和 const,var 可能会带来意想不到的问题。其中,let 适合在需要重新赋值的情况下使用,const 适合在不需要重新赋值的情况下使用。

另外,由于 let 和 const 都是块级作用域,因此在 for 循环中使用时需要注意。

-- -------------------- ---- -------
-------- ------ -
  ----- --- - --- -- ---
  --- ---- - - -- - - ----------- ---- -
    ------------- -- -
      --------------------
    -- ------
  -
-

-------
-- ------

在上述代码中,由于 for 循环体里面的 setTimeout 是一个异步操作,因此 for 循环已经执行完毕,i 的值等于 arr.length,从而导致 console.log(arr[i]) 无法输出结果。

解决此类问题的方式有很多,其中一种方式是使用闭包。

-- -------------------- ---- -------
-------- ------ -
  ----- --- - --- -- ---
  --- ---- - - -- - - ----------- ---- -
    ---- -- -
      ------------- -- -
        --------------------
      -- ------
    ------
  -
-

-------
-- -----------

在上述代码中,我们使用了闭包来使 setTimeout 中的 console.log(arr[i]) 访问到正确的 i 变量。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6455ce79968c7c53b092f890

纠错
反馈