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;

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

想必不用过多解释;

白俊遥博客



白俊遥博客
请先登陆后发表评论
  • 最新评论
  • 总共4条评论
白俊遥博客

花无不缺你一个:大神,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 回复
白俊遥博客

好哇:niubai

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

白俊遥博客

好哇:doubi

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

白俊遥博客

........:123

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