主要理解以下四条
1,预编译
查找 var function
2.,逐行解析,表达式会改变预编译的值
3.作用域链
4.每次到一个新的作用域链重复一1,2两个过程;
eg.1
alert(a); //function fn2(){var a =10} ,预编译 var a =1; alert(a); //1;表达式改变a function fn1(){ var a = 11;} alert(a); //1; 函数块不会改变a的值 var a =2; alert(a); //2 表达式
eg.2
var a =1; function a(){alert(2)}; typeof a ; //"number",typeof返回值是String a(); //报错,因为此时a是number
eg.3
var a = 1; function fn1(){ alert(a); var a = 2; } fn1(); //undefined,调用fn1函数,又开始预编译,此时搜索到var关键字,a为undefined alert(a); //1 此时搜索全局变量下,a=1
eg.4
var a = 1; function fn1(){ alert(a); a = 2; } fn1(); //1 调用fn1函数,预编译未发现关键字,通过作用域链搜索外部中的a alert(a) //2 由于fn1中 a赋值语句未使用var关键字,改变了全局变量a
eg.5
var a = 1; function fn1(a){ alert(a); a = 2; } fn1(); //undefined,由于传参a,其实意味着var a;预编译时发现关键字,声明了a alert(a)//1,由于fn1中var a,故在变量中a是局部变量
eg.6
var a = 1; function fn1(a){ alert(a); a = 2; } fn1(a); //1 alert(a) //1
时间: 2024-10-05 22:55:32