预解析过程:找关键字 function var 参数
|
同名 函数>形参>var变量
|
变量初识赋值undefined,函数初始为代码块
逐行解读过程: script分块自上而下,函数由内到外
|
表达式可修改 预解析的变量和函数赋值(= + - * / % ++ -- ! 参数……)
function nb(){
alert(o)
}
nb()//优先在内部找,找不到再去外部找,还没找到,报错 o is not defined
o= 1//该表达式不做预解析,不满足function var 参数关键字
//示例:
alert(a); // function a (){ alert(4); }
var a = 1;
alert(a); // 1
function a (){ alert(2); }
alert(a); // 1
var a = 3;
alert(a); // 3
function a (){ alert(4); }
alert(a); // 3
alert( typeof a );
// a(); // 报错,函数与表达式重名被取代,函数不存在
var a = 1;
function fn1(){
alert(a); // undefined,优先在局部找变量a,变量a在预解析中解析出来是未定义
var a = 2;
}
fn1();
alert(a); // 1
var a = 1;
function fn1(){
alert(a); // 1
a = 2;
}
fn1();
alert(a); // 2
var a = 1;
function fn1(a){//调用时未传参,参数a预解析为undefined
alert(a); // undefined
a = 2;
}
fn1();
alert(a); // 1
var a = 1;
function fn1(b){
alert(b); // 1
a = 2;//改变外部变量a的值
}
fn1(a);//调用时传参a为1
alert(a); // 2
var a = 1;
function fn1(a){
alert(a); // 1
a = 2;//改变此后内部变量a的值
}
fn1(a);//调用时传参a为1
alert(a); // 1
(function A(){// 命名函数表达式函数体作为函数内部变量
// A = 1 //优先找内部变量,找到函数体,停止查找,便不会在全局创建该变量
// var A = 1 // 优先去找函数内部的变量,找到的A为1
alert(A)//函数A/1
})()