变量提升和函数提升
在作用域一节提到过js的执行顺序,先收集声明,做好准备,然后编译代码,再然后执行。也就是说,所有的声明语句无论写在代码的什么位置,在编译执行的时候,都会优先’执行‘,这就是所谓的提升,更精确的说是声明提升
简单说一下
var a = 2 对于这行声明赋值语句,我们必须要有个认识,可以分解成一下:
var a // 声明语句
a = 2 // 赋值语句
声明语句和赋值语句有个区别,声明语句会进行提升,赋值语句不会
变量提升
代码:
console.log(a) // undefined
var a = 2
实际上:
var a
console.log(a) // undefined
a = 2
代码:
a = 2
var a
console.log(a) // 2
实际上:
var a
a = 2
console.log(a) // 2
函数表达式不提升
代码:
foo() // 2
var foo = function() {console.log(1)}
function foo() {
console.log(2)
}
实际上:
function foo() {
console.log(2)
}
foo() // 2
foo = function() {console.log(1)}
变量和函数名同名
函数声明在前,变量声明在后