深入理解JavaScript 中的匿名函數(shù)((function() {})();)與變量的作用域
匿名函數(shù):沒有實(shí)際名字的函數(shù)。
匿名函數(shù)的作用:
1、通過匿名函數(shù)可以實(shí)現(xiàn)閉包,關(guān)于閉包在后面的文章中會(huì)重點(diǎ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)存。再者,在大型多人開發(fā)的項(xiàng)目中,使用塊級(jí)作用域,會(huì)大大降低命名沖突的問題,從而避免產(chǎn)生災(zāi)難性的后果。自此開發(fā)者再也不必?fù)?dān)心搞亂全局作用域了。
本章節(jié)重點(diǎn)給大家介紹JavaScript 中的匿名函數(shù)((function() {})();)與變量的作用域,具體內(nèi)容如下所示:
以前都是直接用前端框架Bootstrap,突然想看看Javascript,發(fā)現(xiàn)javascript是個(gè)非常有趣的東西,這里把剛碰到的一個(gè)小問題的理解做下筆錄(廢話不多說,上代碼)。
/** * Example 1 */ var localvar = "local var"; console.log(localvar);//local var /** * Example 2 */ console.log(x === undefined); // true var x = 3; /** * Example 3 */ var myvar = "my value"; //Test01 //will return a value of undefined (function() { console.log(myvar); // undefined var myvar = "local value"; console.log(myvar); // local value })(); console.log(myvar);//my value //Test02 (function myFunction(){ console.log(myvar);//my value })(); //Test03 var test = new function(){ console.log(myvar);//my value };
解釋如下:
(1).JavaScript 變量的特別之處是,你可以引用稍后聲明的變量而不會(huì)引發(fā)異常。這一概念稱為變量聲明提升(hoisting);
(2).JavaScript 變量感覺上是被“提升”或移到了函數(shù)或語句的頂部。然而提升后的變量將返回 undefined 值。
(3).在使用或引用某個(gè)變量之后進(jìn)行聲明和初始化操作,這個(gè)被提升的引用仍將得到 undefined 值。
(4).這里Example 3中Test01是這次問題的關(guān)鍵,Test01和Test02是很相似的(至少我看著很相似)。但是最后輸出結(jié)果不能用(1)、(2)、(3)來解釋
經(jīng)過查看官方API文檔發(fā)現(xiàn),在匿名函數(shù)(function() {})();的使用中形成了閉包(重點(diǎn),不清楚的可以查閱閉包的概念,閉包概念還是好理解的);
由于閉包的存在,全局變量自然無法訪問(閉包的一個(gè)重要原因就是為了避免訪問全局變量),故Test01 function中第一句輸出結(jié)果為undefined。
總結(jié)原因:匿名函數(shù)(function() {})();是一個(gè)特殊的閉包寫法。
總結(jié)
以上所述是小編給大家介紹的JavaScript 中的匿名函數(shù)((function() {})();)與變量的作用域,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
layui--select使用以及下拉框?qū)崿F(xiàn)鍵盤選擇的例子
今天小編就為大家分享一篇layui--select使用以及下拉框?qū)崿F(xiàn)鍵盤選擇的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09微信小程序開發(fā)之自定義tabBar的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序開發(fā)之自定義tabBar的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09JavaScript 全面解析各種瀏覽器網(wǎng)頁中的JS 執(zhí)行順序
近來我通過一些測(cè)試以全面的解析網(wǎng)頁在各種瀏覽器中的JavaScript代碼的執(zhí)行順序,在這兒做個(gè)記錄。2009-02-02Javascript 實(shí)現(xiàn)廣告后加載 可加載百度谷歌聯(lián)盟廣告
本文主要介紹一種新的廣告后加載的方式,支持自定義HTML廣告、百度聯(lián)盟廣告和谷歌聯(lián)盟廣告。這種方式在頁面加載完成后執(zhí)行,不影響內(nèi)容的顯示,對(duì)用戶更加友好。2016-05-05JS中比較兩個(gè)Object數(shù)組是否相等方法實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于JS中比較兩個(gè)Object數(shù)組是否相等方法實(shí)例內(nèi)容,有需要的朋友們學(xué)習(xí)下。2019-11-11老生常談javascript中邏輯運(yùn)算符&&和||的返回值問題
下面小編就為大家?guī)硪黄仙U刯avascript中邏輯運(yùn)算符&&和||的返回值問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04