Javascript自執(zhí)行匿名函數(shù)(function() { })()的原理淺析
函數(shù)是JavaScript中最靈活的一種對(duì)象,這里只是講解其匿名函數(shù)的用途。匿名函數(shù)指沒有指定函數(shù)名或指針的函數(shù),自執(zhí)行匿名函數(shù)只是其中一種,下文中稱這種函數(shù)為:自執(zhí)行函數(shù)
下面是一個(gè)最常見的自執(zhí)行函數(shù):
// 傳統(tǒng)匿名函數(shù) (function() { alert('hello'); })();
這段代碼的執(zhí)行效果就是在頁面再載入時(shí)彈出:"hello"
是什么促使它自動(dòng)執(zhí)行的?,來看下面的代碼
// 在傳統(tǒng)寫法上去掉小括號(hào),并在前面加上運(yùn)算符 ~,!,+,- ~function(){ alert('hello'); }(); !function(){ alert('hello'); }(); +function(){ alert('hello'); }(); -function(){ alert('hello'); }();
這些寫法與上文所說的傳統(tǒng)方式執(zhí)行起來并無區(qū)別,
我發(fā)現(xiàn),這些寫法的共同點(diǎn)是運(yùn)算符,其實(shí)傳統(tǒng)方式的小括號(hào)()也屬于運(yùn)算的一種,出現(xiàn)在:a=b*(c+d),
運(yùn)算符 + 傳遞給自生的參數(shù) = 函數(shù)自動(dòng)執(zhí)行?但有些符號(hào)也不支持,比如“=,*,/”號(hào),它自執(zhí)行的原因還是很神秘,網(wǎng)上也找不到像樣的答案
然后我發(fā)現(xiàn)了一個(gè)神奇的現(xiàn)象,這些運(yùn)算符可以無限疊加。。。。。。
// function前面是特定符號(hào)可以無限疊加... ~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~!+-~!+-+-!~~~~~~~~+-!!!!!!+function a(b) { alert('hello'); }();
程序正常運(yùn)行!!!!!!
但是,有兩種情況會(huì)報(bào)錯(cuò)
如果連續(xù)出現(xiàn)三個(gè)及以上的“+”或“-”符號(hào),則會(huì)出錯(cuò);
如果連續(xù)出現(xiàn)兩個(gè)“+”或“-”符號(hào)再接上其他符號(hào),則會(huì)出錯(cuò),例如“++~”,“--+”;
錯(cuò)誤提示:Uncaught ReferenceError: Invalid left-hand side expression in prefix operation (意思是左側(cè)表達(dá)式錯(cuò)誤)
然后我用同樣的符號(hào)來運(yùn)算一個(gè)變量,發(fā)現(xiàn)一模一樣,這或許已經(jīng)可以說明是javascript的運(yùn)算促使函數(shù)的自動(dòng)執(zhí)行,也可以理解為通過運(yùn)算來調(diào)用這個(gè)函數(shù)!
并不是函數(shù)自己執(zhí)行了,而是通過運(yùn)算來調(diào)用這個(gè)函數(shù)!,但只支持部分運(yùn)算方式!
此外,這個(gè)自執(zhí)行函數(shù),未必是匿名函數(shù)!看上方的代碼,我在運(yùn)算符后的函數(shù)中,定義了函數(shù)名稱a,并沒有什么異常,但也沒什么卵用- -!,這個(gè)a依然無法被其他方法調(diào)用,但我覺得很多人都稱其為匿名函數(shù)有點(diǎn)不妥!
以上所述是小編給大家介紹的Javascript自執(zhí)行匿名函數(shù)(function() { })()的原理淺析,希望對(duì)大家有所幫助!
- 深入理解javascript中的立即執(zhí)行函數(shù)(function(){…})()
- js立即執(zhí)行函數(shù): (function ( ){})( ) 與 (function ( ){}( )) 有什么區(qū)別?
- js 在定義的時(shí)候立即執(zhí)行的函數(shù)表達(dá)式(function)寫法
- JavaScript中立即執(zhí)行函數(shù)實(shí)例詳解
- 深入解析JavaScript中的立即執(zhí)行函數(shù)
- JavaScript立即執(zhí)行函數(shù)的三種不同寫法
- js中匿名函數(shù)的N種寫法
- JavaScript 匿名函數(shù)(anonymous function)與閉包(closure)
- js中匿名函數(shù)的創(chuàng)建與調(diào)用方法分析
- 淺析Javascript匿名函數(shù)與自執(zhí)行函數(shù)
- 詳談JavaScript 匿名函數(shù)及閉包
- JS立即執(zhí)行的匿名函數(shù)用法分析
相關(guān)文章
微信小程序授權(quán)登陸及每次檢查是否授權(quán)實(shí)例代碼
這篇文章主要介紹了關(guān)于微信小程序授權(quán)登陸及每次檢查是否授權(quán),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09淺談TypeScript3.7中值得注意的3個(gè)新特性
這篇文章主要介紹了TypeScript3.7中值得注意的3個(gè)新特性,對(duì)TS感興趣的同學(xué),可以參考下2021-05-05小程序開發(fā)之uniapp引入iconfont圖標(biāo)以及使用方式
uniapp本身是有icon組件的,但由于icon組件各端表現(xiàn)存在差異,所以我們可以通過使用iconfont的字體圖標(biāo)來彌補(bǔ)這些差異,下面這篇文章主要給大家介紹了關(guān)于小程序開發(fā)之uniapp引入iconfont圖標(biāo)以及使用方式的相關(guān)資料,需要的朋友可以參考下2022-11-11JavaScript模擬實(shí)現(xiàn)新浪下拉菜單效果
這篇文章主要為大家介紹了如何通過JavaScript模擬實(shí)現(xiàn)新浪的下拉菜單效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手試一試2022-03-03全面解析JavaScript中“&&”和“||”操作符(總結(jié)篇)
這篇文章主要介紹了全面解析JavaScript中“&&”和“||”操作符(總結(jié)篇)的相關(guān)資料,需要的朋友可以參考下2016-07-07JavaScript將數(shù)字轉(zhuǎn)換成大寫中文的方法
這篇文章主要介紹了JavaScript將數(shù)字轉(zhuǎn)換成大寫中文的方法,涉及javascript字符串及匹配的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03關(guān)于IE瀏覽器以及Firefox下的javascript冒泡事件的響應(yīng)層級(jí)
原來是由于IE瀏覽器以及Firefox對(duì)于冒泡型事件的支持層次不同造成的。(如對(duì)冒泡事件不是很了解可先查詢相關(guān)資料)2010-10-10微信小程序動(dòng)畫(Animation)的實(shí)現(xiàn)及執(zhí)行步驟
這篇文章主要介紹了微信小程序動(dòng)畫(Animation) 的實(shí)現(xiàn)及執(zhí)行步驟,需要的朋友可以參考下2018-10-10淺析showModalDialog數(shù)據(jù)緩存問題(用禁止瀏覽器緩存解決)
在使用showModalDialog彈出窗口時(shí),顯示的數(shù)據(jù)是上次修改前的數(shù)據(jù),這是因?yàn)槟J(rèn)情況下頁面保存了緩存,所以顯示的數(shù)據(jù)并不是修改后的情況2013-07-07