变量和函数声明提升

本文详细解析了JavaScript中的变量和函数声明的提升机制。在编译阶段,声明会被提升到各自作用域的顶部,但赋值操作则保留在原地。函数声明优先于变量声明提升,而函数表达式则不会提升。这导致了如`foo()`在未定义前调用会抛出错误,而`foo`赋值后调用才有效。理解这一机制对于避免运行时错误至关重要。
摘要由CSDN通过智能技术生成

引擎会在解释javascript代码之前首先对其进行编译,编译阶段中的一部分就是找到所用的声明,并用合适的作用域将它们关联起来。
因此,包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。

a=2;
var a;
console.log(a); // 2

很多人会认为是undefined
var a;这个声明是在编译阶段进行的,a=2会被留在原地等待执行阶段

console.log(a)
var a=2;   // undefined

只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。

foo();
function foo(){
    console.log(a);  // undefined
    var a=2;
}

foo函数的声明被提升了,foo(…)函数自身也会在内部对a进行提升
因此上面这段代码可以理解为下面这种形式

function foo(){
    var a=2;
    console.log(a);
}
foo();

如果声明了,没有赋初始值,不会报错,该值输出undefined。如果没有声明,会报错ReferenceError。
如果本来是变量,当作函数调用, 会报错TypeError

foo();   // TypeError: foo is not a function
var foo=function bar(){
    console.log("a")
}

函数声明会提升,但是函数表达式不会

foo();  //TypeError
bar();  // ReferenceError:
var foo=function bar(){
    console.log("a")
}

函数优先提升

foo();
var foo;
function foo(){
    console.log(1)
}

foo=function(){
    console.log(2)
}

输出1,而不是2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值