zoukankan      html  css  js  c++  java
  • JavaScript语言精粹之对象

    1. 用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链。
      for(my in obj){
          if(obj.hasOwnProperty(my)){
          ...  
         }
      }

      思考:--用来遍历判断是否有该属性成员,当为一个string var="abcdef"一样的一个字符串时,通过JS代码判断其中是否含有我们需要的某一个字符,比如a,如果有就将其remove

    2. 一个属性存取表达式用于指定一个对象或数组的属性或元素。
    3. 对象字面量:一个对象字面量就是包围在一堆花括号中的0或多个“名/值”对。
      var empty_st={};
      var st={
         "f":"hello",
         "l":"word"            
      }
      //进行调用
      st["f"]   //"hello"
      //当然也可嵌套
      var flagt={
        airline:"Oceanic",
        number:11,
        departue:{
        time:"2015",
        city:"Shanghai"
        }
      };

      JavaScript可以随意的定义全局变量来容纳你的需要的资源,但是这样会削弱程序的灵活性,尽量避免使用,还是尽可能使用上面的那种嵌套形式,这样flagt就变成了一个容器,还且容易看出层次结构.

    4. 每个函数在创建的时候会附加两个隐藏属性:函数的上下文和实现函数行为的代码。每个函数对象在创建的时候也会随机配 有一个prototype属性,他的值是一个拥有constructor属性且值即为该函数的对象。
    5. 函数对象通过函数字面量来创建
      //创建一个名为add的变量,并用来把两个数字相加的函数赋值给它
      var add=function(a,b){
        return a+b;
      }

      该函数是个匿名函数。

    6. 函数的调用模式有四种:方法调用模式,函数调用模式,构造器调用模式,apply调用模式。除了声明的时候定义的形参,每个函数还接受两个附加的参数:this和arguments。
    7. 闭包:

      a:要理解闭包,首先必须理解Javascript特殊的变量作用域。

      变量的作用域无非就是两种:全局变量和局部变量。

      Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。

      var n=999;
        function f1(){
          alert(n);
        }
        f1(); // 999
      //另一方面,在函数外部自然无法读取函数内的局部变量。
        function f1(){
          var n=999;
        }
        alert(n); // error
      /*这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!*/
        function f1(){
          n=999;
        }
        f1();
        alert(n); // 999

      b:如何从外部读取局部变量

      出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。

      那就是在函数的内部,再定义一个函数。

      function f1(){
          n=999;
          function f2(){
            alert(n); // 999
          }
        }

      在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope),

      子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

      既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

      function f1(){
          n=999;
          function f2(){
            alert(n);
          }
          return f2;
        }
        var result=f1();
        result(); // 999

      闭包有什么用?1:取函数内部的变量   2:让这些变量的值始终保持在内存中

      function f1(){
          var n=999;
          nAdd=function(){n+=1}
          function f2(){
            alert(n);
          }
          return f2;
        }
        var result=f1();
        result(); // 999
        nAdd();
        result(); // 1000

      在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

      为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

      这段代码中另一个值得注意的地方,就是“nAdd=function(){n+=1}”这一行,首先在nAdd前面没有使用var关键字,因此 nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个

      匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。

        既然是这么好的东西,那在使用过程中有没有需要注意的地方呢?很明显有!

          注意:

        1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

        2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便

    改变父函数内部变量的值。

  • 相关阅读:
    5.19 省选模拟赛 T1 小B的棋盘 双指针 性质
    5.15 省选模拟赛 容斥 生成函数 dp
    5.15 省选模拟赛 T1 点分治 FFT
    5.15 牛客挑战赛40 B 小V的序列 关于随机均摊分析 二进制
    luogu P4929 【模板】舞蹈链 DLX
    CF 878E Numbers on the blackboard 并查集 离线 贪心
    5.10 省选模拟赛 拍卖 博弈 dp
    5.12 省选模拟赛 T2 贪心 dp 搜索 差分
    5.10 省选模拟赛 tree 树形dp 逆元
    luogu P6088 [JSOI2015]字符串树 可持久化trie 线段树合并 树链剖分 trie树
  • 原文地址:https://www.cnblogs.com/zqzjs/p/4418174.html
Copyright © 2011-2022 走看看