1. 预解析
JavaScript代码是由浏览器中的JavaScript解析器来执行的。
JavaScript代码的时候分为两步:预解析 、 代码执行。
预解析:Js 解释器会把JavaScript里面所有的var还有function提升到当前作用域的最前面。
预解析分为变量预解析(变量提升)和函数预解析(函数提升)
代码执行:按照代码书写的顺序从上往下执行。
2. 变量提升
变量提升就是把所有的变量声明提升到当前作用域的最前面,不提升赋值操作。
eg:变量
console.log(num); //undefined
var num = 13;
// 相当于执行了以下代码
var num;
console.log(num); //undefined
num = 13;
eg2:函数
fu (); // Error 报错
var fu = function() {
console.log('Good');
}
// 相当于执行了以下代码
var fu ;
fu (); // Error 报错
fu = function() {
console.log('Good');
}
以上代码中,相当于先执行了变量声明func为一个变量,并没有声明func()函数,所以结果会报错。
eg3:函数提升
函数提升就是把所有的函数声明提升到当前作用域的最前面,不调用函数。
// 函数提升
func(); // hello world`
function func() {
console.log('hello world`');
}
// 相当于执行了以下代码
function func() {
console.log('hello world`');
}
func(); // hello world`
eg 4 案例
var num = 10;
fun();
function fun() {
console.log(num); // undefined
var num = 20;
}
// 相当于执行了以下代码
var num;
function fun() {
var num;
console.log(num); // undefined
num = 20;
}
num = 10;
fun();
第二题:
//example 1
function f1() {
var a = b = c = 9;
//相当于 var a = 9; b = 9; c = 9; b 和 c 直接复制,没有var 是全局变量
//如果是集体声明: var a = 9, b = 9, c = 9; 则a b c都为局部变量
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
f1();
console.log(b); //9
console.log(c); //9
console.log(a); //Error
// 相当于执行了以下代码
function f1() {
var a;
a = b = c = 9;
//相当于 var a = 9; b = 9; c = 9; b 和 c 直接复制,没有var 是全局变量
//如果是集体声明: var a = 9, b = 9, c = 9; 则a b c都为局部变量
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
f1();
console.log(b); //9
console.log(c); //9
console.log(a); //Error a是局部变量,在函数作用域外调用会报错