• 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();

     

    疯癫不成狂,有酒勿可尝;世间良辰美,终成水墨白。
  • 相关阅读:
    [C#网络编程系列]专题一:网络协议简介
    也谈校园应用微同济的用户体验
    iOS 富文本类库RTLabel
    遥控三通直升机飞行原理简介
    A Distributed Algorithm Exercise
    在Ubantu 下下载代码 android源码 2
    新手模拟器训练指南(固定翼版)
    datasnap 2010 利用心跳包清除TCP死连接
    datasnap 2011 连接池
    datasnap 2010 利用JSON序列化和反序列化任何类型的对象
  • 原文地址:https://www.cnblogs.com/chuyu/p/3188970.html
Copyright © 2020-2023  润新知