变量提升与函数提升
程序员文章站
2023-12-21 19:55:52
...
1.变量声明提升
(1) var声明的变量,在定义语句之前就可以访问到,值为undefined
var a = 3
function fn () {
console.log(a);//undefined
var a = 4
}
fn()
相当于
var a = 3
function fn () {
var a
console.log(a);//undefined
a = 4
}
fn()
2.函数声明提升
(2)function声明的函数,在之前就可以直接调用,值为函数定义(对象)
var a = 3
fn()
function fn () {
console.log('fn执行了');
console.log(a);//undefined
var a = 4
}
b()//b is not a function
var b = function fn(){
console.log('bfn执行了');
}
fn()可调用,b不可调用,因为b是变量,变量提升后,默认值为undefined,无法作为函数执行
3.测试题
var a = function () {
console.log(1)
}
function a(){
console.log(2)
}
a() //1
执行顺序是:1. 变量a提升 ->undefined
2. 函数提升->替换掉 a-> (){console.log(2)}
3. 执行到js var a = function () { console.log(1) }
时,a又被替换为a->(){console.log(1)}
所以最后输出1
先执行 变量提升,再执行函数提升
if(!(b in window)){
var b = 1
}
console.log(b); //undefined
b变量提升,存在于window中 所以b in window 返回true ,再取反,为false,所以b没有赋值,为undefined
var c = 1
function c(c) {
console.log(c);
var c = 3
}
c(2) //c is not a function
先执行 变量提升,再执行函数提升 然后再执行赋值,即c=1,所以c为数值,不是方法