var,let,const变量声明的区别
- 作用域:
- 当var在函数内部声明变量时,变量具有函数作用域,由于var变量声明提前因此可以在函数内部任意位置使用,但不可以在函数外部使用,且该变量不会成为window对象的一个属性;当var在函数外部声明时,该变量具有全局作用域,可以在代码的任意位置使用,且该变量会成为window对象的一个属性;当var声明的变量函数作用域和全局作用域冲突时(比如在函数内部和外部同时用var定义了同名的变量),在函数内部以函数作用域为先,此时要访问全局作用域的变量,可以通过window的属性来访问
let
和const
声明的变量具有块级作用域,这意味着它们只在声明它们的代码块内有效。
- 变量提升:
- 使用
var
声明的变量会发生变量提升,即在声明之前使用该变量不会报错,但变量的值为undefined
。 - var声明的函数作用域变量,其变量提升范围在作用域范围内,在函数外部外仍无法使用该变量
- 使用
let
和const
声明的变量不会发生变量提升,如果在声明前使用会抛出ReferenceError
错误。
- 使用
- 重复声明:
- 使用
var
可以在同一作用域内重复声明同一个变量,后声明的同名变量会覆盖之前声明的值。 - 使用var声明的变量可以再次使用var重复声明,但不能用let和const重复声明var已经声明过的变量
- 使用
let
在同一作用域内不能重复声明同一个变量,否则会抛出语法错误。 - 使用
const
声明的是一个常量,一旦赋值后不能修改,即使尝试修改也会抛出TypeError
错误。
- 使用
- 变量赋值:
- 使用
var
和let
声明的变量可以被重新赋值。 - 使用
const
声明的变量是常量,一旦赋值后不能修改,即使尝试修改也会抛出TypeError
错误。但是,对于对象和数组,虽然不能改变它们的引用,但可以修改对象内部的属性和数组的内容。
- 使用
- 全局属性:
- 使用
var
声明的全局作用域变量会成为浏览器的全局对象(如window对象)的属性,但函数作用域的变量不会成为window的属性。 - 使用
let
和const
声明的变量不会成为全局对象的属性。
- 使用