Javascript(以下简称JS)文件是通过浏览器的解释器来运行的,解释器的解释过程分为预解析和代码执行。其中预解析中会进行变量声明和函数的提升。
先说结论
- 提升优先级为函数优先级高于变量
- 变量提升只提升声明,函数提升会提升整个代码块
- 只有显示声明的变量会提升,只有function声明的函数会提升
- 首次提升时,同名变量或函数的声明会以前者为准,忽略后者
下面是例子
1.提升优先级为函数优先级高于变量
2. 变量提升只提升声明,函数提升会提升整个代码块
4. 提升时,同名变量或函数的声明会以前者为准,忽略后者
console.log(x); //undefined
var x = 1;
function fn() {
console.log(x); // 函数本身 function x() { console.log(x)}
var x = 2;
function x() { console.log(x)}
console.log(x); // 2
x(); //报错
}
fn();
// 解析
var x
console.log(x); // undefined 声明提前
x = 1
function fn() {
function x() {console.log(x)}
var x;
console.log(x); // 函数本身(名字相同,忽略后者var x)
x = 2;
console.log(x); // 2 这里进行了赋值操作
x(); // 报错; 这里没有函数了,只有变量x
}
fn();
- 只有显示声明的变量会提升,只有function声明的函数会提升
function foo() {
console.log(a);
console.log(b); // 报错
b = 'aaa';//隐式全局变量不提升,故报错
var a = 'bbb';
console.log(a);
console.log(b);
console.log(f);// undefined
var f=function(){
console.log('b');
}
}
foo();