代码在执行之前先要预解析
不是所有东西都要解析,主要解析变量和函数,只有带有声明的变量(n=7 没有声明),带有名字的函数才会被解析
总结:1. 变量在未声明即被访问时会报语法错误
2. 变量在声明之前即被访问,变量的值为undefined
3.let
声明的变量不存在变量提升,推荐使用let
【也有人认为具有提升但是不赋值不能使用】
4. 变量提升出现在相同作用域当中
5. 实际开发中推荐先声明再访问变量
变量预解析:把变量的声明语法提升到作用域最前面(只定义不赋值)——变量提升
直接赋值的变量不会预解析(没有加声明的全局变量)
var n = 1;
console.log(n);
//var n;---解析出来的
console.log(n);
var n = 1;
函数预解析:把函数的声明语法提升到作用域最前面(只声明不调用)——函数提升
//var a 预解析
//function f1 () {
// var b
// var b = 9;
// console.log(a);//undifined
// console.log(b);//9
// var a = 123;
}
var a = 18;
f1();
function f1 () {
var b = 9;
console.log(a);
console.log(b);
var a = 123;
}
- 函数提升能够使函数的声明调用更灵活
- 函数表达式不存在提升的现象
- 函数提升出现在相同作用域当中
let 预解析
function fn() {
console.log(n);
let n = 123; //报错,let 不存在预解析,必须先定义后使用,
}
fn();
例子1:
▲▲▲函数优于变量
//function a () {
console.log("aa");
}
//var a
console.log(a)//函数
function a () {
console.log("aa");
}s
var a = 1;
console.log(a);//1
例子2:
注意:var a = b = c = 9; 这句话等价于一下三句:
var a = 9;
b = 9;
c = 9;
//function f1 () {
//var a
var a = b = c = 9;
console.log(a);//undifined
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);//全局
function f1 () {
var a = b = c = 9;//a是局部
console.log(a);
console.log(b);
console.log(c);
}