变量提升
var 的变量提升
使用var
声明的变量,存在变量提升(hoisting)。
console.log(a) // undefined |
虽然a还没有声明,但是我们可以使用这个变量。我们可以把代码这样看:
var a; |
变量的声明被提升到了开头。注意,提升的是变量声明而不是变量赋值。
在函数中用var
声明的变量会提升到函数开头。
此外,函数也存在提升。function
声明的函数,整个函数定义都会被提升。并且,函数的提升是优于变量的提升的。
sayHi("JavaScript"); // "Hello, JavaScript" |
函数sayHi
可以在声明语句前被使用。
注意,以下方法定义函数的话达不到这种效果:
bye("JavaScript"); // Uncaught TypeError: bye is not a function |
原因也是var
变量声明会被提升,以上代码相当于:
var bye; // bye 为 undefined |
let和const没有变量提升
console.log(a); // ReferenceError: Cannot access 'a' before initialization |
在let
语句声明a
之前,我们是不可以用这个a
的,否则会报错。
重复声明
由于var
变量声明存在提升,因此var
可以重复声明变量:
var a = 1; |
let
和const
不能重复声明。
作用域
var
只有两种作用域:全局作用域和函数作用域。
在let
和const
出现之前,程序员都是用立即执行函数(IIFE)来模拟块级作用域的。
(function() { |
let
和const
还有块级作用域——包括代码块{}
、if-else
、for
语句。
总结
var
、let
、const
的区别是:
var
声明的变量,可以在其声明语言前被使用;let
和const
需要先声明再使用。var
可以重复声明,let
和const
不能重复声明;var
只有全局作用域和函数作用域,let
和const
还有块级作用域;var
在全局作用域下声明变量会导致变量挂载在window
上,其他两者不会let
声明的变量复制后值能改变,const
声明的变量赋值后不能再改。
Author: kpt
Permalink: http://kpt.ink/2021/08/26/var-let-const/
文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。