函數表達式


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;
  }();
相關文章
相關標籤/搜索