• JavaScript 中定义变量时有无var声明的区别


    关于JavaScript中定义变量时有无var声明的区别

    var a=5;    //正确
    
    a=5;    //正确

      在javascript中,以上两种方法都是定义变量的正确方法。微软的Script56.CHM中是这样解释的:

      尽管并不安全,但声明语句中忽略 var 关键字是合法的JS语法。这时,JS 解释器给予变量全局范围的可见度。当在过程级中声明一个变量时,它不能用于全局范围,这种情况下,变量声明必须用 var 关键字。

      

    从上面的描述看来,对待这两种定义方法要区分以下两种情况:

    1.在一个过程级中(即位于function的定义范围内,无论是函数,还是类)的任何地方,包括在一个区块里(for,while,if……),定义变量时,使用var定义,则此变量只在这个过程级内起作用,反之为全局变量。

    2.在过程级外定义变量时,无论是否忽略var,都将定义一个全局变量。

    从这点看来,JS和其他语言有不一样的地方,变量的范围不以“{}”作为边界,而是以”function(){}”为边界,而且在过程内可以很轻松的定义全局变量。如果不注意这个问题的话,是很容易产生不可预知的错误的。

      

      区别一:在函数作用域内 加var定义的变量是局部变量(在方法内),不加var定义的就成了全局变量。

      例1:变量使用 var 定义:

    <script>
           var a="hello world";
           function test1(){
               var a="hello sxl";
               alert(a);
           }
           test1();   //输出“hello sxl”
           alert(a);  //输出“hello world” ,或者无定义var a="hello world";时,无输出
    </script>

      例2:变量不使用 var 定义:

    <script>
           var a="hello world";
           function test2(){
               a="hello sxl";
               alert(a);
           }
           test2();   //输出“hello sxl”
           alert(a);  //输出“hello sxl”
    </script>

      例3:

      <script type="text/javascript">
           var gobal="global";
           var a=10;
           test3();    //1.输出顺序: gobal,local 
           function test3(){
               var local="local";
               alert(gobal);
               alert(local);
           }
           alert(a);   //2.输出: 10
           alert(local);  //3.无输出  ,但若是把 test3() 方法内的 var local="local";var 去掉,则输出local
       </script>

      在上面的test3方法内,当把local变量的var去掉后,local就变成了全局变量,但是在局部不使用local,则这个local作为全局是无效的。

      为了验证这点,我把test3方法内部唯一使用local变量的这句代码注释掉.发现在外部也打印不出来了。如下代码所示:

      例4:

       <script type="text/javascript">
           var gobal="global";
           var a=10;
           test4(); //结果只输出一个 “global”
           function test4(){
            // local="local";
               alert(gobal);
               alert(local);
           }
           alert(a);  //无输出
           alert(local); //无输出
       </script>

      总结:全局变量可以不声明var 函数内变量必须声明var,在定义全局变量时加或不加var关键字没什么影响;但在定义局部变量时如果不加var关键字javascript解释程序会将其解释为全局变量。

      

      区别二:在全局作用域下,使用var定义的变量不可以delete,没有var 定义的变量可以delete.也就说明隐含全局变量严格来说不是真正的变量,而是全局对象的属性,因为属性可以通过delete删除,而变量不可以。

      区别三:使用var 定义变量还会提升变量声明,如:

      例5:变量使用 var 定义:

      <script type="text/javascript">
    
           function test5(){
               console.log(a);
                var a="hello JavaScript ";
           }
            test5();   // 控制台:“undefined”
       </script>

      例6:变量没有使用 var 定义:

     <script type="text/javascript">
    
           function test6(){
               console.log(a);
                a="hello JavaScript ";
           }
           test6();   // 控制台上:“Uncaught ReferenceError: a is not defined”
       </script>

         这就是使用var定义的变量的声明提前。

      区别四:在ES5的'use strict'模式下,如果变量没有使用var定义,就会报错。

     

    变量作用域的规则如下:

    1.如果在函数或代码块中使用var 关键字声明一个变量,那么这是一个属于这个函数或代码块的局部变量;

    2.如果使用一个没有用var 关键字声明的变量,并且存在同名的全局变量,那么该局部变量将等同于已经存在的全局变量;

    3.如果使用var 关键字在局部声明一个变量,但是没有对变量进行初始化(即为变量赋值),那么它是个局部变量,但是它是未定义的;

    4.如果在局部声明变量时没有使用var关键字,或者显式地声明为全局变量,但是没有初始化它,那么它是一个可以全局访问的变量,但是也是未定义的。

    (——《JavaScript 学习指南》Shelley Powers 著)

    参考:http://www.jb51.net/article/53909.htm

    尽管并不安全,但声明语句中忽略 var 关键字是合法的 JScript 语法。这时,JScript 解释器给予变量全局范围的可见度。当在过程级中声明一个变量时,它不能用于全局范围;这种情况下,变量声明必须用 var 关键字。

  • 相关阅读:
    VMware Workstation 8.0.0 安装 Red Hat5.3
    Struts2 结合HttpClient 实现远程服务器文件下载
    按位与、或、异或等运算方法
    Java中实例方法、类方法和构造方法
    JAVA中类、实例与Class对象
    Shell学习笔记——循环
    placement new带来的rapidxml.hpp编译错误
    从GitHub下载CocosBuilder2.1的源码
    Visual Studio中,同一个solution内多个project之间的引用
    cocos2dx中让根节点的opacity影响孩子节点
  • 原文地址:https://www.cnblogs.com/shenxiaolin/p/5399130.html
Copyright © 2020-2023  润新知