js 的匿名函数
像上面這種,function后面沒(méi)有函數(shù)名的函數(shù)就叫做匿名函數(shù)。以上是將匿名函數(shù)賦值給了sum變量。
還有一種寫(xiě)法:
alert((function(x,y){return x+y; })(2,3));//結(jié)果為5
?當(dāng)單獨(dú)運(yùn)行一個(gè)匿名函數(shù)時(shí)會(huì)報(bào)錯(cuò),比如:
function() {console.log(123) }?
塊級(jí)作用域:
在匿名函數(shù)中的變量屬于塊級(jí)作用域,
(function(){var la="你好哦";})(); console.log(la);//報(bào)錯(cuò)---la is not defined?匿名函數(shù)的作用:
1、通過(guò)匿名函數(shù)可以實(shí)現(xiàn)閉包。閉包是可以訪問(wèn)在函數(shù)作用域內(nèi)定義的變量的函數(shù)。若要?jiǎng)?chuàng)建一個(gè)閉包,往往都需要用到匿名函數(shù)。
2、模擬塊級(jí)作用域,減少全局變量。執(zhí)行完匿名函數(shù),存儲(chǔ)在內(nèi)存中相對(duì)應(yīng)的變量會(huì)被銷毀,從而節(jié)省內(nèi)存。再者,在大型多人開(kāi)發(fā)的項(xiàng)目中,使用塊級(jí)作用域,會(huì)大大降低命名沖突的問(wèn)題,從而避免產(chǎn)生災(zāi)難性的后果。自此開(kāi)發(fā)者再也不必?fù)?dān)心搞亂全局作用域了。
https://blog.csdn.net/conatic/article/details/61627183
?閉包:
我們有時(shí)候需要得到函數(shù)內(nèi)的局部變量。但是正常情況下,這是辦不到的,只有通過(guò)在函數(shù)的內(nèi)部,再定義一個(gè)函數(shù),這就形成了閉包。
function f1(){//f1不可以訪問(wèn)f2內(nèi)部的局部變量var n=999;function f2(){//f2可以訪問(wèn)f1內(nèi)的局部變量alert(n); // 999 }}函數(shù)f2就被包括在函數(shù)f1內(nèi)部,這時(shí)f1內(nèi)部的所有局部變量,對(duì)f2都是可見(jiàn)的。但是反過(guò)來(lái)就不行,f2內(nèi)部的局部變量,對(duì)f1就是不可見(jiàn)的。這就是Javascript語(yǔ)言特有的"鏈?zhǔn)阶饔糜?#34;結(jié)構(gòu)(chain scope),子對(duì)象會(huì)一級(jí)一級(jí)地向上尋找所有父對(duì)象的變量。所以,父對(duì)象的所有變量,對(duì)子對(duì)象都是可見(jiàn)的,反之則不成立。
?
既然f2可以讀取f1中的局部變量,那么只要把f2作為返回值,我們不就可以在f1外部讀取它的內(nèi)部變量了嗎
function f1(){var n=999;function f2(){alert(n); }return f2;}var result=f1();result(); // 999?
?
使用閉包需要注意的問(wèn)題:
由于閉包會(huì)使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會(huì)造成網(wǎng)頁(yè)的性能問(wèn)題,在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。
閉包會(huì)在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。所以,如果你把父函數(shù)當(dāng)作對(duì)象(object)使用,把閉包當(dāng)作它的公用方法(Public Method),把內(nèi)部變量當(dāng)作它的私有屬性(private value),這時(shí)一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值。
?
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
?
轉(zhuǎn)載于:https://www.cnblogs.com/150536FBB/p/11428798.html
總結(jié)
- 上一篇: 滚动条插件nicescroll的使用
- 下一篇: require(),include(),