var sum = function(x,y){alert(x+y); };
像上面這種,function后面沒有函數名的函數就叫做匿名函數。以上是將匿名函數賦值給了sum變量。
還有一種寫法:
alert((function(x,y){return x+y; })(2,3));
//結果為5
?當單獨運行一個匿名函數時會報錯,比如:
function() {console.log(123) }
?
塊級作用域:
在匿名函數中的變量屬于塊級作用域,
(function(){var la="你好哦";})(); console.log(la);//報錯---la is not defined
?匿名函數的作用:
1、通過匿名函數可以實現閉包。閉包是可以訪問在函數作用域內定義的變量的函數。若要創建一個閉包,往往都需要用到匿名函數。
2、模擬塊級作用域,減少全局變量。執行完匿名函數,存儲在內存中相對應的變量會被銷毀,從而節省內存。再者,在大型多人開發的項目中,使用塊級作用域,會大大降低命名沖突的問題,從而避免產生災難性的后果。自此開發者再也不必擔心搞亂全局作用域了。
https://blog.csdn.net/conatic/article/details/61627183
?閉包:
我們有時候需要得到函數內的局部變量。但是正常情況下,這是辦不到的,只有通過在函數的內部,再定義一個函數,這就形成了閉包。
function f1(){//f1不可以訪問f2內部的局部變量var n=999;function f2(){//f2可以訪問f1內的局部變量alert(n); // 999 }}
函數f2就被包括在函數f1內部,這時f1內部的所有局部變量,對f2都是可見的。但是反過來就不行,f2內部的局部變量,對f1就是不可見的。這就是Javascript語言特有的"鏈式作用域"結構(chain scope),子對象會一級一級地向上尋找所有父對象的變量。所以,父對象的所有變量,對子對象都是可見的,反之則不成立。
?
既然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
?