js变量提升心得
旧版本变量提升:
旧版本浏览器没有块级作用域这种说法,只有全局作用域与函数作用域
在旧版本中变量提升
变量提升定义:js在代码执行之前,会将变量声明提升到所属作用域的最顶端
例如
console.log(foo) // undefined
var foo = 'bar';
console.log(foo) // bar
上述代码可以看作
var foo // 经变量提升定义提升到所属作用域的最顶端
console.log(foo) // undefined
var foo = 'bar';
console.log(foo) // bar
变量提升注意要点:
1、当变量同名时函数提升的优先级高于变量提升
2、提升变量时,提升的是变量的声明,而提升函数时,会将函数的声明和定义一起提升
例如
console.log(foo)
foo()
var foo = 'bar';
function foo(){
console.log(1)
}
console.log(foo) // bar
输出结果为:
function foo(){
console.log(1)
}
1
bar
上述代码相当于:
function foo(){
console.log(1)
}
var foo
console.log(foo)
foo()
var foo = 'bar';
console.log(foo) // bar
新版本变量提升
新版本中函数变量提升更改为了只提升函数的声明,而不提升函数的定义
console.log(a)
var a = 0
if(true){
console.log(a)
function a(){}
console.log(a)
}
console.log(a)
相当于:
var a
console.log(a) // undefined
a = 0
if(true){
// 一旦进入块级作用域,function a(){}不会给a重新赋值,但是为了兼容旧版本,会把修改过的a映射到全局,此时全局的a就是一个函数
function a
console.log(a)
function a(){}
console.log(a)
}
console.log(a)
结果:
undefined
a(){}
a(){}
a(){}
如有错误请各位指正