百度的文章里有说函数声明提升在前的,也有说变量提升在前的,到底谁在前呢?求教
按顺序提升,function 定义的在提升阶段就给变量赋值了,所以后定义的会覆盖前面定义的变量的值。var 定义的变量在提升阶段不会赋值,只会提升变量定义,如果变量在提升阶段已经由其他 var 定义或者 funciton 定义,则它不产生任何影响,所以也不存在覆盖前面提升的值的问题。var语句在执行阶段才会进行真正的赋值,所以console.log的值实际是执行阶段的结果。
console.log(foo)
function foo(){
console.log('bb')
}
function foo(){
console.log('cc')
}
var foo = 'aa'
console.log(foo)
用 let 来证明确实是按顺序提升
function test(){
function foo(){}
let foo;
}
test(); // 报错提示第三行 let foo处标识符重复定义
function test2(){
let foo;
function foo(){}
}
test2(); // 报错提示第三行 function foo()处标识符重复定义
如果函数提升在前,那 test2 应该报错第二行。
函数声明提升在前
比如:
console.log(foo)
var foo = 'aa'
function foo(){
console.log('bb')
}
输出
ƒ foo() {
console.log('bb')
}
把 var foo = 'aa' 放在后面输出结果相同
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
变量提升是发生在创建变量对象的过程中,会先扫描函数声明,再扫描变量声明,如果变量名与已经声明的函数相同,此时什么都不会发生,变量声明不会干扰已经存在的这个同名属性
可以看下这个哦JavaScript基础系列---执行环境与作用域链