zoukankan      html  css  js  c++  java
  • JS 变量

    感谢原文作者:zhangxiaohui
    原文链接:https://www.cnblogs.com/xiaohuizhang/p/11755737.html

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

    • 使用var
      var num = 1;
      是在当前域中声明变量. 如果在方法中声明,则为局部变量(local variable);如果是在全局域中声明,则为全局变量。

    • 不使用var
      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)。在严格模式中,为未声明的标识符赋值将会抛引用错误,因此可以防止意外的全局变量属性的创造。目前一些浏览器的新版本已经支持。

    下面的strict模式示例来自:廖雪峰老师的JS教程

    'use strict';
    // 如果浏览器支持strict模式,
    // 下面的代码将报ReferenceError错误:
    abc = 'Hello, world';
    console.log(abc);
    
    
  • 相关阅读:
    HBase with MapReduce (MultiTable Read)
    HBase with MapReduce (SummaryToFile)
    HBase with MapReduce (Summary)
    HBase with MapReduce (Read and Write)
    HBase with MapReduce (Only Read)
    Hbase中的BloomFilter(布隆过滤器)
    HBase的快照技术
    How To Use Hbase Bulk Loading
    Cloudera-Manager修改集群的IP
    Java中的HashSet和TreeSet
  • 原文地址:https://www.cnblogs.com/tfxz/p/12823671.html
Copyright © 2011-2022 走看看