摘要:?jiǎn)栴}解答定義了一個(gè)名為的立即執(zhí)行函數(shù)表達(dá)式我們來(lái)看這一段代碼,這里面包含著一個(gè)名為的具名函數(shù)表達(dá)式。
IIFE 是什么呢?
IIFE 是 Immediately-Invoked Function Expression 的英文縮寫(xiě),也就是立即執(zhí)行函數(shù)表達(dá)式。
下面是一個(gè) IIFE 代碼實(shí)例:
(function(){ console.log( "Hello!" ); })(); > Hello!
// 定義了一個(gè)名為 IIFE 的函數(shù) function IIFE(){ console.log( "Hello!" ); } IIFE(); > Hello!
// 定義了一個(gè)名為 IIFE 的立即執(zhí)行函數(shù)表達(dá)式 (function IIFE(){ console.log( "Hello!" ); })(); IIFE(); > Hello! > Uncaught ReferenceError: IIFE is not defined
我們定義了一個(gè)名為 IIFE 的函數(shù),然后執(zhí)行,發(fā)現(xiàn)成功輸出 Hello! 。
但是我們定義了一個(gè)名為 IIFE 的立即執(zhí)行函數(shù)表達(dá)式,然后使用 IIFE() 去執(zhí)行它的時(shí)候卻發(fā)現(xiàn)報(bào)錯(cuò) IIFE is not defined 。
這是為什么呢?
要解答這個(gè)疑惑,我們需要了解函數(shù)表達(dá)式和函數(shù)聲明的區(qū)別。
在 JavaScript 中有三種定義函數(shù)的方式。
// 方式一:使用 Function 構(gòu)造函數(shù)來(lái)定義一個(gè)函數(shù) var foo = new Function() // 方式二:使用 function 關(guān)鍵字來(lái)定義一個(gè)函數(shù) function foo(){} // 方式三:使用函數(shù)表達(dá)式來(lái)定義一個(gè)函數(shù) var foo = function(){}
其中方式二和方式三非常相似。并且方式三種函數(shù)表達(dá)式也可以有自己名字,如下所示:
var foo = function foo(){}
那么函數(shù)表達(dá)式和函數(shù)聲明有什么區(qū)別呢?
當(dāng)一條語(yǔ)句以 function 開(kāi)頭的時(shí)候,它就是函數(shù)聲明。
函數(shù)表達(dá)式可以添加()來(lái)執(zhí)行,而函數(shù)聲明不能。
函數(shù)表達(dá)式分匿名函數(shù)表達(dá)式和具名函數(shù)表達(dá)式,但是函數(shù)表達(dá)式中的函數(shù)名稱只是函數(shù)體中的一個(gè)本地變量(在方式三中可以通過(guò) foo.name 來(lái)訪問(wèn)到該本地變量)。
函數(shù)表達(dá)式可以被用作一個(gè) IIFE,它一旦定義就運(yùn)行。
// 定義了一個(gè)名為 IIFE 的立即執(zhí)行函數(shù)表達(dá)式 (function IIFE(){ console.log( "Hello!" ); })(); IIFE(); > Hello! > Uncaught ReferenceError: IIFE is not defined
我們來(lái)看這一段代碼,這里面包含著一個(gè)名為 IIFE 的具名函數(shù)表達(dá)式。這個(gè)函數(shù)名稱只是函數(shù)體中的一個(gè)本地變量,所以我們?cè)谕獠客ㄟ^(guò)函數(shù)名訪問(wèn)不到該函數(shù)。
另外我們可以來(lái)看看 IIFE 的兩種定義方式,如下所示:
// 方式一: (function(){ console.log( "Hello!" ); })(); // 方式二: (function (){ console.log( "Hello!" ); }());
由于 function 開(kāi)頭的語(yǔ)句會(huì)被識(shí)別為函數(shù)聲明,函數(shù)聲明不能被執(zhí)行,所以在這里添加括號(hào)來(lái)標(biāo)識(shí)這里是一個(gè)函數(shù)表達(dá)式,括號(hào)的結(jié)束位置可以在函數(shù)表達(dá)式定義結(jié)束,也可以在函數(shù)表達(dá)式執(zhí)行結(jié)束。與下面的代碼的效果是相同的。
var fn = function (){ console.log( "Hello!" ); }; ( fn )(); ( fn() ); > Hello! > Hello!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/90758.html
摘要:另外,如果你想跳過(guò)這里,你可以直接跳到立即調(diào)用函數(shù)表達(dá)式進(jìn)行閱讀,但是我建議你讀完整篇文章。當(dāng)圓括號(hào)包裹函數(shù)時(shí),它會(huì)默認(rèn)將函數(shù)作為表達(dá)式去解析,而不是函數(shù)聲明。 原文:Immediately-Invoked Function Expression (IIFE) by Ben Alman原譯:立即執(zhí)行函數(shù) by Murphywuwu改增內(nèi)容: by blanu 也許你沒(méi)有注意到,我是一個(gè)...
摘要:上面這段代碼,在中的執(zhí)行結(jié)果是什么呢大家思考分鐘好,分鐘已過(guò),大家有結(jié)果了嗎千萬(wàn)不要在瀏覽器的控制臺(tái)中去寫(xiě)這段代碼,雖然結(jié)果和你開(kāi)始想的結(jié)果一樣,但是,它是錯(cuò)誤的。這是在控制臺(tái)中執(zhí)行的結(jié)果這是在中的執(zhí)行結(jié)果可以看到兩個(gè)結(jié)果是不一樣的。 1. 引言 假設(shè)有這么一道題: for (var i = 0; i < 10; i++) { console.log(i); for (...
摘要:所以那些匿名函數(shù)附近使用括號(hào)或一些一元運(yùn)算符的慣用法,就是來(lái)引導(dǎo)解析器,指明運(yùn)算符附近是一個(gè)表達(dá)式。 Immediately-invoked Function Expression(IIFE,立即調(diào)用函數(shù)),簡(jiǎn)單的理解就是定義完成函數(shù)之后立即執(zhí)行。因此有時(shí)候也會(huì)被稱為自執(zhí)行的匿名函數(shù)(self-executing anonymous function)。 IIFE的叫法最早見(jiàn)于Ben...
摘要:使用進(jìn)行模塊化打包在之前打包的過(guò)程中,命令行中輸出了一行,這表示并沒(méi)有收到任何模塊化的格式指令,因此會(huì)用默認(rèn)的模塊標(biāo)準(zhǔn)來(lái)對(duì)文件進(jìn)行打包。 前言 最近在做一個(gè)提供給瀏覽器和node同時(shí)使用的js的url模板工具類,在用什么打包工具上糾結(jié)了一段時(shí)間,正好有一天在知乎上看到了關(guān)于rollup的介紹,在自己試了試之后,就決定用rollup.js來(lái)打包自己的工具類了。 這篇文章主要是為了讓對(duì)ro...
閱讀 1248·2021-11-24 09:39
閱讀 390·2019-08-30 14:12
閱讀 2604·2019-08-30 13:10
閱讀 2447·2019-08-30 12:44
閱讀 972·2019-08-29 16:31
閱讀 856·2019-08-29 13:10
閱讀 2454·2019-08-27 10:57
閱讀 3164·2019-08-26 13:57