函数表达式


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

  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";this

  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,()();能够减小闭包占用的内存问题,只要函数执行完毕,就当即销毁其做用域链了
四,私有变量
有权访问私有变量和私有函数的共有方法称为特权方法spa

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

1,静态私有变量firefox

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

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

  (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,加强的模块模式
  指定单例必须是某种类型的实例时code

  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;
  }();
相关文章
相关标签/搜索