javascript 中的var : 隐含变量 全局变量 变量提升

  Javascript 总是在不知不觉中就出人意料地创建全局变量,其原因在于javascript 的两个特性。

  第一个特性是javascript 可直接使用变量,甚至无需声明;

  第二个特性是javascript 有个暗示全局变量的概念,即任何变量,如果未经声明,就为全局对象所有。

1 function foo(x,y){
2     var a = b =0;  
3 }

  上面的 var a = b =0; 就相当于 var a = (b = 0);//从右至左的操作符优先级 。这里的b 就是一个隐式全局变量。

  写成 var a, b; 

            a = b =0;

  隐式全局变量 与 明确定义的全局变量有细微的不同,不同之处在于能否使用 delete 操作符撤销变量

  - 使用 var 创建的全局变量(这类变量子啊函数外部创建)不能删除。

  - 不使用 var 创建的隐含全局变量(尽管它是在函数内部创建)可以删除。

  这表明隐含全局变量严格来讲不是真正的变量,而是全局对象的属性,属性可以通过 delete 操作符删除,但变量不可以。

  以下为验证代码:

 1 var global_var = 1;
 2 global_novar = 2;
 3 (function(){
 4     global_fromfunc = 3;
 5 });
 6 
 7 //企图删除
 8 delete global_var;//false
 9 delete global_novar;//true
10 delete global_fromfunc;//true
11 
12 typeof global_var;//"number"
13 typeof global_novar;//"undefined"
14 typeof global_fromfunc;//"undefined"

  单一var 模式:

  只使用一个var 在函数顶部进行变量声明是一种非常有用的模式。它的好处在于:

  - 提供一个单一的地址以查找到函数需要的的所有局部变量;

  - 防止出现变量在定义前就被使用的逻辑错误;

  - 帮助牢记要声明变量,以尽可能少地使用全局变量;

  - 更少的编码。

  单一 var 模式如下所示:

function func(){
    var a = 1,
          b = 2,
          sum = a + b,
          myobject = {},
          i,
          j;

    //函数体
}

  注意变量之间以逗号间隔

  js 中变量声明提升:

  先看例子:

  

1 myname = "Nick";
2 
3 function func(){
4     alert(myname);//未定义
5     var myname = "Devil";
6     alert(myname);//"局部变量"  
7 }
8 
9 func();

  第 4 行,乍一看是alert 全局变量 myname ,事实并非如此!javascript 允许在函数的任意地方声明多个变量,无论在哪里声明,效果都等同于子啊函数顶部进行声明。这就是所谓的“提升”。上面代码等同于:

myname = "Nick";

function func(){
    var myname;//声明提前
    alert(myname);//未定义
    myname = "Devil";
    alert(myname);//"局部变量"  
}

func();

 

疯癫不成狂,有酒勿可尝;世间良辰美,终成水墨白。
原文地址:https://www.cnblogs.com/chuyu/p/3188970.html