JS域解析

245 阅读2分钟

预解析过程:找关键字 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
})()