• 函数表达式



    1,函数声明function functionName(arg0,agr1,arg2){} 在firefox,safari,chrome中通过name属性返回函数名
    2,函数声明提升,可以把函数声明放在调用它的语句后面
    3,函数表达式:var functionName = function(arg0,arg1,arg2){};不被提升,必须放在调用它的语句前面
    一,递归
    1,argument.callee是一个指向正在执行的函数的指针,在函数名改变的情况下,使用argument.calleee代替函数名实现函数的递归调用
    二,闭包

      function f1(){
        var n = 10000;
        function f2(){
          访问到n可以操作n;
        }
        return f2;
      }

    1,闭包与变量

      function f1(){
        var n = 10000;
        function f2(){
          访问到n可以操作n;
        }
        return f2;
      }

    2,关于this对象
    全局环境中,this等于window,当函数被作为方法是用时,this指向这个对象

      var name = "the window";
      var object = {
        name:"my Object",
        getNameFunc:function(){
          return function(){
            return this.name;
          };
        }
      };
      alert(object.getNameFunc()()); 返回the window

    将外部函数的this对象保存在闭包能够访问到的变量里
      var name = "the window";

      var object = {
        name:"my Object",
        getNameFunc:function(){
          var that = this;
          return function(){
            return that.name;
          }
        };
      };
      alert(object.getNameFunc()()); 返回my object

      使用argument有同样的问题,所以要想访问作用域中的argument对象,必须将该对象的引用保存在另个闭包能够访问到的变量中
    3,内存泄露
    闭包会引用包含函数的整个活动对象,最好在外部函数中定义闭包能直接访问的变量,闭包结束后释放变量,减少引用数
    函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止
    三,模仿块级作用域
    1,for循环语句中定义的变量,可以在for循环外部访问到
    2,js不会响应是否多次声明了同一个变量,忽略后面的声明但是不会忽略后续中的初始化
    3,用作块级作用域的(私有作用域)的匿名函数的语法:(function(){//这里是块级作用域})();
    4,函数声明后面不能加(),函数表达式后面可以加();
    5,匿名函数中定义的任何变量在结束后都会消失
    6,()();可以减少闭包占用的内存问题,只要函数执行完毕,就立即销毁其作用域链了
    四,私有变量
    有权访问私有变量和私有函数的共有方法称为特权方法

      function(){
        //私有变量和私有函数
        var privateFunction = 10;
        function privateFunction(){
          return false;
        }
        //特权方法
        this.publicMethod = function(){
          privateVariable++;
          return privateFunction();    
        }
      }

    1,静态私有变量

      (function(){
        //私有变量和私有函数
        var privateVariable = 10;
        function PrivateFunction(){return false;}
        //构造函数(使用函数表达式方式实现)
        MyObject = function(){};
        //共有特权方法,在构造函数原型上实现
        MyObject.prototype.publicMethod = function(){privateVariable ++;return privateFunction();};
      })();

    2,模块模式
      1)创建单例对象,以对象字面量的方式来创建

      (function(){
        //私有变量和私有函数
        var privateVariable = 10;
        function PrivateFunction(){return false;}
        //构造函数(使用函数表达式方式实现)
        MyObject = function(){};
        //共有特权方法,在构造函数原型上实现
        MyObject.prototype.publicMethod = function(){privateVariable ++;return privateFunction();};
      })();

      2)模块模式为单例添加私有变量和特权方法使其得到增强

        var singleton = function(){
          //私有变量和私有函数
          var privateVariable = 10;
          function privateFunction(){return false;}
          //特权共有方法
          return{
            publicProperty:true,
            publicMethod:function(){
              privateVariable ++;
              return privateFunction();
            }
          };
        }();

    3,增强的模块模式
      指定单例必须是某种类型的实例时

      var singleton = function(){
        //私有函数和私有变量
        var privateVariable = 10;
        function privateFunction(){return false;}
        //创建特定类型的对象实例
        var object = new CustomType();
        //添加特权共有属性和方法
        object.publicProperty = true;
        object.publicMethod = function(privateVariable ++;return privateFunction();){};
        //返回这个对象
        return object;
      }();
  • 相关阅读:
    celery
    KeyError: 'pass_ticket'
    Go语言标准库之context
    Go语言标准库之log
    Go语言标准库之time
    Go语言基础之Cookie和Session
    #if...#endif的用法总结
    汇总#pragma用法
    Linux串口编程(转载)
    Linux系统调用(转载)
  • 原文地址:https://www.cnblogs.com/b0xiaoli/p/3622614.html
Copyright © 2020-2023  润新知