废话不说;先来段代码;

var scope='global';
function test(){
    alert(scope);        // 输出undefine;而不是global
    var scope='local';  
    alert(scope);        // 输出local
}
test();

脑算下;你可能会认为第一alert会输出global;

但是事实上第一个alert输出的是undefined;

这是怎么回事呢?

要探讨这个问题首先要解释下两个概念;

1:函数作用域:

    函数作用域指的是函数内声明的变量只在此函数内有效;

2:声明提前:

    声明提前的意思是说在函数内任何位置声明的变量都会提前至函数最上边首先解析;


理解声明提前的概念后也就是说上面这段代码等价于如下;

如果从字面上没能理解这个声明提前;那么从代码中就容易懂了;

var scope='global';
function test(){
    var scope;           // 先声明了此变量
    alert(scope);        // 因为还未赋值;所以是undefine
    scope='local';       // 赋值
    alert(scope);        // 输出local
}
test();

那么引申出来的经验也就是说在函数体内首先把要用到的变量都在函数开始就声明;

而不是说用到的时候才声明变量;

至于为什么第一个alert不是输出global;

因为函数体内的局部变量是会遮盖全局变量的;

想必不用过多解释;

javascript的函数作用域及声明提前-LMLPHP




05-30 05:18