在 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