javascript代码在执行时表面并不是由上到下一行一行执行的。
浏览器引擎会在解释 JavaScript 代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。所以正确的思路应该是: 所有变量的声明都会在任何代码被执行前首先被处理(函数也一样)。
优先提升变量声明,之后提升函数声明
提升只会提升到当前作用域!
function fn(a) {
console.log(a);
var a = 2;
function a() {}
console.log(a);
}
fn(1);
输出结果是 ƒ a() {} 2
该代码可以转化为
function fn(a) {
var a;
function a() {}
console.log(a);
a = 2;
console.log(a);
}
fn(1);
另外let和const不会声明提升
function fn(a) {
console.log(a);
let a = 2;
}
fn(1);
和
function fn(a) {
console.log(a);
const a = 2;
}
fn(1);
会提示错误: Uncaught SyntaxError: Identifier 'a' has already been declared
参考文献: