首页 » JavaScript » [置顶] js的变量作用域 ,函数名,变量名覆盖问题

[置顶] js的变量作用域 ,函数名,变量名覆盖问题

2015-09-27 11:40:03阅读(239)

js的变量作用域 ,函数名,变量名覆盖问题
(function(){
    a = 5;
    alert(window.a);
    var a = 10;
    alert(a);
})();

结果: undefined 10


代码等同于下面

var a = undefined;   //定义全局变量
(function(){
    var a;     // 
    a = 5;     // a = 5;但是被局部变量覆盖,这时候的a是局部变量
    alert(window.a);  //a = undefined; 试图访问全局变量a,可是并没有赋值
    a = 10;           //依然是局部变量a
    alert(a);         //a = 10
})();

分析:
1.在产生一个作用域的时候,会预编译一次里面的变量,其中的动作是将所有的变量名,函数名,提前定义,然后在赋予当前的变量的所在作用域,运行。
2.变量名的定义会覆盖函数名,可是函数名(见下面)

var a;
function a(){
    alert(12);
}
a();      //alert(12)
a = 10;   
a();      //Uncaught TypeError: a is not a function

a的定义,function的定义 换个顺序

    (function(){
       var a=10;
       function a(){
         alert(2);
         return 8;
        }
       alert(a); 
       alert(a());//Uncaught TypeError: a is not a function
    })();
    //分析:a() 的函数名并不会覆盖变量名

    function a(){
        alert(2);
        return 8;
    }
    (function(){
       var a=10;
       alert(a);   // 10
       alert(a());//结果:Uncaught TypeError: a is not a function;如果把函数名称换成c,那么js会往上级查找,如果在本作用域中找到a,那么直接调用,这时的调用会忽略a的类型(若类型的语言?)
       alert(window.a());// 2, 8
    })();
  • 在建立以一个作用域时,编译时,变量的声明会提前,在确定作用域,运行。
  • js中的变量名不会被同名的函数覆盖,而同名的函数会被变量覆盖。
  • 在js中调用函数,如果有同名的变量,那么会直接调用这个变量,不会向上查找,如果没有这个变量,才会向上查找

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹