废话不说;先来段代码;函数
var scope='global'; function test(){ alert(scope); // 输出undefine;而不是global var scope='local'; alert(scope); // 输出local } test();
脑算下;你可能会认为第一alert会输出global;code
可是事实上第一个alert输出的是undefined;作用域
这是怎么回事呢?博客
要探讨这个问题首先要解释下两个概念;it
1:函数做用域:io
函数做用域指的是函数内声明的变量只在此函数内有效;function
2:声明提早:class
声明提早的意思是说在函数内任何位置声明的变量都会提早至函数最上边首先解析;test
理解声明提早的概念后也就是说上面这段代码等价于以下;变量
若是从字面上没能理解这个声明提早;那么从代码中就容易懂了;
var scope='global'; function test(){ var scope; // 先声明了此变量 alert(scope); // 由于还未赋值;因此是undefine scope='local'; // 赋值 alert(scope); // 输出local } test();
那么引伸出来的经验也就是说在函数体内首先把要用到的变量都在函数开始就声明;
而不是说用到的时候才声明变量;
至于为何第一个alert不是输出global;
由于函数体内的局部变量是会遮盖全局变量的;
想必不用过多解释;