国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js中的立即執(zhí)行函數(shù)

zhunjiee / 2748人閱讀

摘要:匿名函數(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

相關(guān)文章

  • JS進(jìn)階篇2---函數(shù)防抖(debounce)

    摘要:函數(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ì)重...

    zhongmeizhi 評(píng)論0 收藏0
  • JS之模仿塊級(jí)作用域_立即執(zhí)行函數(shù)

    摘要:模仿塊級(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ì)非常感謝您的指...

    NoraXie 評(píng)論0 收藏0
  • 模塊化、閉包與立即執(zhí)行函數(shù)的使用、MVC里的V和C

    摘要:模塊化里的和閉包與立即執(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組件的使...

    2501207950 評(píng)論0 收藏0
  • 進(jìn)擊的 JavaScript(五) 之 立即執(zhí)行函數(shù)與閉包

    摘要:匿名函數(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è)條件。...

    vincent_xyb 評(píng)論0 收藏0
  • 前端校招準(zhǔn)備系列--js中的setTimeout到底是什么?

    摘要:瀏覽器是多進(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í)器中的打印和方法中打...

    Godtoy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<