提升
变量和函数声明从它们在代码中出现的位置被“移动”到了最上面,这叫变量的提升。分为两个部分,第一部分是将所有的变量声明和函数声明放在了代码的最上方,第二部分的代码运行到指定位置时再执行。
直觉上会认为js代码在执行时是由上到下一行一行执行的,但实际上这并不完全正确
考虑一下代码
a = 2;
var a;
console.log(a)
很多人会认为是undefined,因为var a 在a = 2之后,认为变量会重新赋值,但是实际输出结果是2
上面的代码等价于
var a;
a = 2;
console.log(a);
考虑另外一段代码
console.log(a);
var a = 2
你可能会认为会输出2或者认为会抛出ReferenceError异常,但是实际是会输出undefined。
这是因为变量a都会在最开始就声明,这个过程就好像变量和函数声明从他们在代码中出现的位置被“移动”到最上面,这个过程叫作“提升”。
函数也会存在提升
foo();
function foo(){
console.log(a);
var a=2;
}
相当于
function foo(){
var a;
console.log(a);
a=2;
}
foo();
但是需要注意的一点是函数声明会提升,但是函数表达式却不会被提升
比如
foo();
var foo = function bar(){
//代码
}
会报错,但是是TypeError而不是ReferenceError 因为表达式不会被提升,最开始会声明 var foo;所以对变量进行函数调用就会报错