摘要:匿名函數(shù)的好處在于可以減少局部變量,以免污染現(xiàn)有的運(yùn)行環(huán)境。另外通過(guò),這三個(gè)符號(hào)運(yùn)行的匿名函數(shù)比運(yùn)行的匿名函數(shù)可以減少一個(gè)字符的使用但是我們通常使用加因?yàn)槠渌牟僮鞣赡軙?huì)帶來(lái)其他的影響更多可以參考
js中的立即執(zhí)行函數(shù)
( function(){…} )()和( function (){…} () )是兩種javascript立即執(zhí)行函數(shù)的常見寫法
問題:為什么會(huì)出現(xiàn)上面的兩種不一樣的寫法,上面的寫法難道不是簡(jiǎn)單的就是一個(gè)括號(hào)包裹匿名函數(shù)對(duì)象,再在后面加個(gè)括號(hào)調(diào)用函數(shù),最后達(dá)到函數(shù)定義后立即執(zhí)行的目的????然而并不是我想的那么簡(jiǎn)單
除了這兩種常用的方式: (function(){ //do something here; })(); ( function (){//do something here; }}()); 還有一種方式為: !function(){ // do something }();
在這里開頭要加上 ! 或者 ~ , - 和 +。(都是英文符號(hào))
為什么這里要這樣子,為什么要在前面加上()、!、+、-、=等運(yùn)算符????
因?yàn)?JavaScript 文法明確規(guī)定表達(dá)式語(yǔ)句不得以 function 或者 {
為開頭(http://es5.github.io/#x12.4)
ExpressionStatement → [lookahead ? {{, function}] Expression;好的現(xiàn)在帶來(lái)更多的困惑了......
首先想要明白這個(gè)問題需要弄清函數(shù)表達(dá)式(function expression)和函數(shù)聲明(function declaration)的區(qū)別:
函數(shù)表達(dá)式:函數(shù)表達(dá)式中的函數(shù)可以為匿名函數(shù),也可以有函數(shù)名,但是該函數(shù)實(shí)際上不能直接使用,只能通過(guò)表達(dá)式左邊的變量 a 來(lái)調(diào)用。
var a = function(){ alert("Function expression"); }; var b = new a();函數(shù)聲明:
// 函數(shù)聲明時(shí)必須有函數(shù)名
function a(){ alert("Function declaration"); } a();下面來(lái)看一下這段代碼:
~function() { console.log("hi"); } ();
實(shí)際上可以分為兩個(gè)部分(~function() { console.log("hi")} 和()部分)前面部分的匿名函數(shù)通過(guò)一元操作符變成了函數(shù)表達(dá)式,因而可以通過(guò)在表達(dá)式的后面使用 () 來(lái)執(zhí)行 。
因此,執(zhí)行匿名函數(shù)可以通過(guò)+,-,!,() 這里的括號(hào)也是一種運(yùn)算符,稱為分組運(yùn)算符
這樣的形式來(lái)轉(zhuǎn)化為函數(shù)表達(dá)式,就可以通過(guò)表達(dá)式的后面使用 () 來(lái)執(zhí)行
( function() {}() ); ( function() {} )(); [ function() {}() ]; ~ function() {}(); ! function() {}(); + function() {}(); - function() {}(); delete function() {}(); typeof function() {}(); void function() {}(); new function() {}(); new function() {}; var f = function() {}(); 1, function() {}(); 1 ^ function() {}(); 1 > function() {}();下面看一個(gè)組錯(cuò)誤的的現(xiàn)象:
function (){console.log("hi")}(); VM354:1 Uncaught SyntaxError: Unexpected token ) function g(){ console.log("hi")}(); VM519:1 Uncaught SyntaxError: Unexpected token )(1) function (){ }()
期望是立即調(diào)用一個(gè)匿名函數(shù)表達(dá)式,結(jié)果是進(jìn)行了函數(shù)聲明,函數(shù)聲明必須要有標(biāo)識(shí)符做為函數(shù)名稱,而這里用()來(lái)做為標(biāo)識(shí)符是非法的.
(2) function g(){ }()期望是立即調(diào)用一個(gè)具名函數(shù)表達(dá)式,結(jié)果是聲明了函數(shù) g。末尾的括號(hào)作為分組運(yùn)算符,必須要提供表達(dá)式做為參數(shù)。
function g(){ console.log("hi")}(1); >1
所以那些匿名函數(shù)附近使用括號(hào)或一些一元運(yùn)算符的慣用法,就是來(lái)引導(dǎo)解析器,指明運(yùn)算符附近是一個(gè)表達(dá)式。
匿名函數(shù)的好處在于:可以減少局部變量,以免污染現(xiàn)有的運(yùn)行環(huán)境。jQuery等庫(kù)都用到了這樣的原理。
另外:通過(guò)+,-!這三個(gè)符號(hào)運(yùn)行的匿名函數(shù)比()運(yùn)行的匿名函數(shù)可以減少一個(gè)字符的使用,但是我們通常使用加(),因?yàn)槠渌牟僮鞣赡軙?huì)帶來(lái)其他的影響
更多可以參考
ECMA-262-3 in detail. Chapter 5. Functions.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/86416.html
摘要:函數(shù)防抖的要點(diǎn),是需要一個(gè)來(lái)輔助實(shí)現(xiàn),延遲運(yùn)行需要執(zhí)行的代碼。若計(jì)時(shí)期間事件沒有被重新觸發(fā),等延遲時(shí)間計(jì)時(shí)完畢,則執(zhí)行目標(biāo)代碼。而非立即執(zhí)行版指的是觸發(fā)事件后函數(shù)會(huì)立即執(zhí)行,然后秒內(nèi)不觸發(fā)事件才能繼續(xù)執(zhí)行函數(shù)的效果。。 JS中的函數(shù)防抖 一、什么是函數(shù)防抖 概念:函數(shù)防抖(debounce),就是指觸發(fā)事件后,在 n 秒內(nèi)函數(shù)只能執(zhí)行一次,如果觸發(fā)事件后在 n 秒內(nèi)又觸發(fā)了事件,則會(huì)重...
摘要:模仿塊級(jí)作用域立即執(zhí)行函數(shù)前言最近在細(xì)讀高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方一筆帶過(guò),所以用自己所理解的,嘗試細(xì)致解讀下。語(yǔ)法如下這里是塊級(jí)作用域以上代碼定義并立即調(diào)用了一個(gè)匿名函數(shù)。 模仿塊級(jí)作用域-立即執(zhí)行函數(shù) 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方一筆帶過(guò),所以用自己所理解的,嘗試細(xì)致解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指...
摘要:模塊化里的和閉包與立即執(zhí)行函數(shù)的使用這篇文章記錄我寫在線個(gè)人簡(jiǎn)歷過(guò)程中學(xué)習(xí)的知識(shí)完整代碼暫未完成預(yù)覽地址輪播組件的使用英文官網(wǎng)中文網(wǎng)使用方法模塊化學(xué)習(xí)寫代碼的方法抄運(yùn)行修改模塊化把對(duì)應(yīng)功能放到塊里面這個(gè)塊可以是文件或者或者別的等等立即執(zhí) 模塊化、MVC里的V和C、閉包與立即執(zhí)行函數(shù)的使用 這篇文章記錄我寫在線個(gè)人簡(jiǎn)歷過(guò)程中學(xué)習(xí)的知識(shí)完整代碼(暫未完成)預(yù)覽地址 輪播Swiper組件的使...
摘要:匿名函數(shù)是不能單獨(dú)寫的,所以就提不上立即執(zhí)行了。六立即執(zhí)行函數(shù)在閉包中的應(yīng)用立即執(zhí)行函數(shù)能配合閉包保存狀態(tài)。來(lái)看下上節(jié)內(nèi)容中閉包的例子現(xiàn)在,我們來(lái)利用立即執(zhí)行函數(shù)來(lái)簡(jiǎn)化它第一個(gè)匿名函數(shù)執(zhí)行完畢后,返回了第二個(gè)匿名函數(shù)。 前面的閉包中,提到與閉包相似的立即執(zhí)行函數(shù),感覺兩者還是比較容易弄混吧,嚴(yán)格來(lái)說(shuō)(因?yàn)橄透叱虒?duì)閉包的定義不同),立即執(zhí)行函數(shù)并不屬于閉包,它不滿足閉包的三個(gè)條件。...
摘要:瀏覽器是多進(jìn)程的,而瀏覽器的內(nèi)核渲染進(jìn)程是多線程的。如果已經(jīng)將回調(diào)函數(shù)放進(jìn)任務(wù)隊(duì)列,但是主線程正在執(zhí)行一個(gè)非常耗時(shí)的任務(wù),當(dāng)這個(gè)任務(wù)執(zhí)行完畢后,主線程去任務(wù)隊(duì)列中取任務(wù),這個(gè)時(shí)候,就會(huì)出現(xiàn)連續(xù)執(zhí)行的情況,也就是說(shuō)相當(dāng)于失效了。 前言 ??在刷筆試題的時(shí)候,經(jīng)常會(huì)碰到setTimeout的問題,只知道這個(gè)是設(shè)置定時(shí)器;但是考察的重點(diǎn)一般是在一個(gè)方法中包含了定時(shí)器,定時(shí)器中的打印和方法中打...
閱讀 637·2023-04-26 01:53
閱讀 2761·2021-11-17 17:00
閱讀 2895·2021-09-04 16:40
閱讀 1997·2021-09-02 15:41
閱讀 845·2019-08-26 11:34
閱讀 1234·2019-08-26 10:16
閱讀 1343·2019-08-23 17:51
閱讀 833·2019-08-23 16:50