主要理解以下四条
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是numbereg.3
var a = 1;
function fn1(){
alert(a);
var a = 2;
}
fn1(); //undefined,调用fn1函数,又开始预编译,此时搜索到var关键字,a为undefined
alert(a); //1 此时搜索全局变量下,a=1eg.4
var a = 1;
function fn1(){
alert(a);
a = 2;
}
fn1(); //1 调用fn1函数,预编译未发现关键字,通过作用域链搜索外部中的a
alert(a) //2 由于fn1中 a赋值语句未使用var关键字,改变了全局变量aeg.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本文出自 “f2e小菜鸟” 博客,请务必保留此出处http://10024302.blog.51cto.com/10014302/1627826
原文地址:http://10024302.blog.51cto.com/10014302/1627826