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