alert( a ); var a = 10; alert( a ); functiona(){alert(20)}; alert( a ); var a = 30; alert( a ); functiona(){alert(40)}; alert( a ); // 函数块 10 10 30 30
分析
1:找定义 function a(){alert(40)};
2:执行 alert( a ) //函数块
a = 10;
alert( a ); // 10
alert( a ); // 10
a = 30;
alert( a ); // 30
alert( a ); // 30
举例2
1 2 3 4 5 6 7 8
a(); var a = function(){alert( 1 );} a(); functiona(){alert(2);} a(); var a = function(){alert(3);} a(); //2 1 1 3
分析
1:找定义
function a(){alert(2);}
2:执行
a(); //2
a = function(){alert( 1 );}
a(); //1
a(); //1
a = function b(){alert(3);};
a();//3
举例3
1 2 3 4 5 6 7 8
var a = 0; functionfn(){ alert( a ); var a = 1; alert( a ); } alert(a); fn();
分析
1:找定义
var a
function fn(){}
2:执行
a = 0;
fn(); ===> 1:找定义
2:执行 alert(a); //undefined
a = 1;
alert(a); //1
举例4
1 2 3 4 5 6 7 8 9 10
fn()(); var a = 0; functionfn(){ alert( a ); var a = 3; functionc(){ alert( a ); } return c; };
分析
1:找定义
var a
function fn
2:执行
fn() ===> 1:找定义 function c
2:执行 alert(a); //undefined
a = 3
return function c
fn()() ==>1:找定义 function c
2:alert(a);//undefined 3
a = 0;
举例5
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var a = 5; functionfn(){ var a = 10; alert(a); functionb(){ a++; alert(a); }; return b; }; var c = fn(); c(); fn()(); c();
分析
1:找定义 var a
function fn
var c
2:执行 a = 5;
c = fn(); === > 1:找定义 var a
function b
2:执行 a = 10;
alert(a); //10
return function b(){};
c();=========> 1:找定义
2:执行 a++; //11
alert(a);//11
fn()(); //10 11
c() ========> 1:找定义
2:执行 a++;//11+1;
alert(a); //12
举例6
1 2 3 4 5 6 7 8 9 10 11 12 13
//alert(x);//9:执行弹出x,结果x没定义,错误. alert(i);//9:执行弹出i,然而i之前已经定义,只不过没地址,因此是undefiend var i = 10;//1:var i; 10:把常量池中10的地址赋给栈中的i var j = "你好";//2:var j; 11:把常量池中 你好 的地址复给栈中的j var k = z = null;//3:var k,z; 12:把堆中null的地址赋值给z和k var m = function(){//4:var m; 5:function匿名函数 13:把匿名函数在堆中的地址赋给栈中的m alert(2); } var b = document.body;//6:var b; 14:把堆中document.body对象的地址赋给栈中的b var f = true;//7:var f; 15:把常量池中true的地址赋给栈中的变量f functionm(){//8:function m; alert(1); }
举例7
1 2 3 4 5 6 7 8 9 10
functionm(){ c = 50;//在局部变量中找不到定义的c 沿着作用域链找到了全局变量的c alert('哈哈哈'); //var c; }
var c = 150; // 函数m()还未执行到 还没被销毁 此时全局c的值c=50 m(); var c = 20;//到这里一步 m()已经执行完了 函数已经销毁了 这里的c还是20 alert(c);//20
举例8
1 2 3 4 5 6 7 8 9 10 11 12 13 14
functionm(){ c = 50;//在局部变量中找不到定义的c 沿着作用域链找到了全局变量的c alert('哈哈哈'); functioninner(){ c = 30; alert('嘻嘻'); } inner();//c在函数内部找不到定义 所以沿着作用域链找到了全局的c }