今天遇到一道js的面试题,知道是关于变量提升的问题,但是还是有点犹豫,赶紧复习了下,原谅自己太菜
原题如下
function say(){
console.log(a) //undefined
console.log(b) //b is not defined
var a='aaaa'
let b="bbb"
}
say()
在js中,浏览器在执行代码前会有一次预编译,这个过程会把函数声明和变量声明提升到作用域的顶端,并赋值undefind,这个过程就叫提升
并且在js中,函数是一等公民,优先级是最高的,稍后会解释
这就不难理解刚才那道题了,上面的代码编译后如下
function say(){
var a -----变量提升,赋值为undefined
console.log(a)// undefined
console.log(b)
a="aaa"
let b="bbb" //let 没有提升,
}
say()
首先会进行函数提升,然后是变量提升,剩下的就按顺序写
1、变量提升
console.log(a) //undefined
var a='aaaaa'
say()
function say (){
console.log(a) //undefined
var a="你好"
console.log(a) //你好
}
</script>
预编译如下
var a; =====>变量提升
console.log(a); //undefined
function say (){ =======>函数声明 提升
var a;
console.log(a) //undefined
a="你好"
console.log(a) //你好
}
a = 'aaaaa'
say()
2、函数,一等公民,优先级高于函数表达式和变量提升
function fn(){
say() ====>222
var a=function() {
console.log('111')
}
a() ====>111
function say(){ =====>函数声明优先级高于函数表达式的
console.log('222')
}
}
fn()