预解析
一、 预解析(在对应的作用域内执行)
* 函数或者变量都会有一个提解析的过程,js会把函数或者变量提前解析一下,解析到它们对应的作用域最开始的僧
* 步骤
* 首先是在全局域下进行,
* 1、先找var 、function关键字以及参数
* 2、如果找到了var(声明的变量,参数),会给他赋一个undefined。如果找到了function,那它会把整个函数都拿过来
* 如果没有找到var那么就相当于结束了
* 3、把找到的东西,放到对应的作用域的最开始的位置
* 4、逐行执行代码
* 如果到了函数域(一个新的域里面),又会在函数域重新进行1.2.3.4
//var a=undefined;
/*var b=undefined;
function fn(){
console.log(b); //undefined
var b=20;
}*/ console.log(a); //undefined
var a=10;
console.log(a); //10
var b=12;
function fn(){
//var b=undefined;因为在函数域里面又重新开始找var并且找到了赋了一个undefined.
console.log(b); //undefined
var b=20;
}
fn();
var b=12;
function fn(){
//因为在这里的函数域没有var,所以就没有重新赋予一个undefinded,
//直接的就用了上一个域里面的var b=12
console.log(b); //undefined
}
fn();二、函数预解析
/*function fn1(){
console.log('fn1');
}
var fn2=undefined;
function(){
console.log('fn2');
}*/
/*
* 函数
* 1、函数声明
* 函数声明可以被预解析,所以可以先调用,再声明
* 2、函数表达式
* 函数表达式,不会被预解析,所以只能先声明再调用,不能把调用放在声明的前面(不然就报错)
*/
fn1(); //在这里fn1是可以调用
function fn1(){
console.log('fn1');
}
//fn1();
//fn2(); //报错
var fn2=function(){
console.log('fn2');
}
fn2(); //fn2