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

废话不说;先来段代码;

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;
因为函数体内的局部变量是会遮盖全局变量的;
想必不用过多解释;
白俊遥博客

白俊遥博客
请先登录后发表评论
  • latest comments
  • 总共9条评论
白俊遥博客

花无不缺你一个 :大神,js 函数 可以直接读取 外部变量的啊~我测试第一个alert可以输出global的啊~你是不是弄错了

2016-11-11 13:28:49 回复

白俊遥博客 白俊遥博客

云淡风晴 :换个姿势再试试?我这确认弹出来的是undefine;

2016-11-11 22:37:11 回复

白俊遥博客

花无不缺你一个 :哦~原来我没写全 我只写了 function test(){alert(scope);} 这样是可以输出 global的 但还是没明白 为什么你写的那种方式 会输出undefined 函数里用到的变量 如果本身没定义的话 不是会一级一级往上找么?

2016-11-12 09:25:57 回复

白俊遥博客

花无不缺你一个 :哦~原来我没写全 我只写了 function test(){alert(scope);} 这样是可以输出 global的 但还是没明白 为什么你写的那种方式 会输出undefined 函数里用到的变量 如果本身没定义的话 不是会一级一级往上找么?

2016-11-12 09:25:58 回复

白俊遥博客

急速野驴 :我也是新人,如果回答有误还请及时指出.我查了下,应该是函数内声明局部变量的时候,覆盖了全局变量,而此时局部变量尚未赋值导致

2017-09-15 14:20:47 回复

白俊遥博客

宋齐梁 :你说的问题就是上面说的:“声明提前”,因为在大神写的例子中函数内对scope进行了二次声明,所以造成了这种情况,去掉函数内的声明或是去掉var 将声明改成赋值,就不会出现undefine了。不知道现在回复能不能看到

2018-08-11 16:46:09 回复

白俊遥博客

好哇 :niubai

2016-03-19 16:35:14 回复

白俊遥博客

好哇 :doubi

2016-03-19 16:35:00 回复

白俊遥博客

........ :123

2015-12-25 20:20:23 回复