js 的匿名函數

var sum = function(x,y){
      alert(x+y);
};

像上面這種,function後面沒有函數名的函數就叫作匿名函數。以上是將匿名函數賦值給了sum變量。javascript

還有一種寫法:html

alert((function(x,y){
    return x+y;
})(2,3));
//結果爲5

 當單獨運行一個匿名函數時會報錯,好比:java

function() {
    console.log(123)
}

 

塊級做用域:閉包

在匿名函數中的變量屬於塊級做用域,函數

(function(){
        var la="你好哦";
 })();
console.log(la);//報錯---la is not defined

 匿名函數的做用:性能

一、經過匿名函數能夠實現閉包。閉包是能夠訪問在函數做用域內定義的變量的函數。若要建立一個閉包,每每都須要用到匿名函數。
二、模擬塊級做用域,減小全局變量。執行完匿名函數,存儲在內存中相對應的變量會被銷燬,從而節省內存。再者,在大型多人開發的項目中,使用塊級做用域,會大大下降命名衝突的問題,從而避免產生災難性的後果。自此開發者不再必擔憂搞亂全局做用域了。
https://blog.csdn.net/conatic/article/details/61627183spa

 閉包:.net

咱們有時候須要獲得函數內的局部變量。可是正常狀況下,這是辦不到的,只有經過在函數的內部,再定義一個函數,這就造成了閉包。code

function f1(){//f1不能夠訪問f2內部的局部變量
   var n=999;
  
    function f2(){//f2能夠訪問f1內的局部變量
   alert(n); // 999
  }

}

  函數f2就被包括在函數f1內部,這時f1內部的全部局部變量,對f2都是可見的。可是反過來就不行,f2內部的局部變量,對f1就是不可見的。這就是Javascript語言特有的"鏈式做用域"結構(chain scope),子對象會一級一級地向上尋找全部父對象的變量。因此,父對象的全部變量,對子對象都是可見的,反之則不成立。htm

 

既然f2能夠讀取f1中的局部變量,那麼只要把f2做爲返回值,咱們不就能夠在f1外部讀取它的內部變量了嗎

function f1(){

    var n=999;

    function f2(){
      alert(n); 
    }

    return f2;

}

var result=f1();

result(); // 999

 

 

使用閉包須要注意的問題:

因爲閉包會使得函數中的變量都被保存在內存中,內存消耗很大,因此不能濫用閉包,不然會形成網頁的性能問題,在IE中可能致使內存泄露。解決方法是,在退出函數以前,將不使用的局部變量所有刪除。

閉包會在父函數外部,改變父函數內部變量的值。因此,若是你把父函數看成對象(object)使用,把閉包看成它的公用方法(Public Method),把內部變量看成它的私有屬性(private value),這時必定要當心,不要隨便改變父函數內部變量的值。

 

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

相關文章
相關標籤/搜索