zoukankan      html  css  js  c++  java
  • js中变量声明有var和没有var的区别

    转js中var用与不用的区别

    Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种方式还是有区别的。可以正常运行的代码并不代表是合适的代码。

    var num = 1;

    是在当前域中声明变量. 如果在方法中声明,则为局部变量(local variable);如果是在全局域中声明,则为全局变量。

    而 num = 1;

    事实上是对属性赋值操作。首先,它会尝试在当前作用域链(如在方法中声明,则当前作用域链代表全局作用域和方法局部作用域etc。。。)中解析 num; 如果在任何当前作用域链中找到num,则会执行对num属性赋值; 如果没有找到num,它才会在全局对象(即当前作用域链的最顶层对象,如window对象)中创造num属性并赋值。

    注意!它并不是声明了一个全局变量,而是创建了一个全局对象的属性。

    即便如此,可能你还是很难明白“变量声明”跟“创建对象属性”在这里的区别。事实上,Javascript的变量声明、创建属性以及每个Javascript中的每个属性都有一定的标志说明它们的属性----如只读(ReadOnly)不可枚举(DontEnum)不可删除(DontDelete)等等。

    由于变量声明自带不可删除属性,比较var num = 1 跟 num = 1,前者是变量声明,带不可删除属性,因此无法被删除;后者为全局变量的一个属性,因此可以从全局变量中删除


    详情看如下代码:
    // num1为全局变量,num2为window的一个属性  
                          var num1 = 1; 
                          num2 = 2; 
                          // delete num1;  无法删除 
                          // delete num2;  删除 
                          function model(){ 
                                 var num1 = 1; // 本地变量 
                                 num2 = 2;     // window的属性 
                                 // 匿名函数 
                                 (function(){ 
                                        var num = 1; // 本地变量 
                                        num1 = 2; // 继承作用域(闭包) 
                                        num3 = 3; // window的属性 
                                 }()) 
                          }
     

    PS. 在ECMAScript5标准中,有一种“严格模式”(Strict Mode)。在严格模式中,为未声明的标识符赋值将会抛引用错误,因此可以防止意外的全局变量属性的创造。目前一些浏览器的新版本已经支持。

  • 相关阅读:
    leetcode 78. 子集 JAVA
    leetcode 91. 解码方法 JAVA
    leetcode 75. 颜色分类 JAVA
    leetcode 74 搜索二维矩阵 java
    leetcode 84. 柱状图中最大的矩形 JAVA
    last occurance
    first occurance
    classical binary search
    LC.234.Palindrome Linked List
    LC.142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/zhouyu0001/p/9489282.html
Copyright © 2011-2022 走看看