IIFE中的函式是函式表示式,而不是函式宣告

2022-04-15 15:40:46 字數 1148 閱讀 1699

下面的**列印什麼內容,為什麼?

var b = 10;

(function

b())();

針對這題,在知乎上看到別人的回答說:

函式表示式與函式宣告不同,函式名只在該函式內部有效,並且此繫結是常量繫結。

對於乙個常量進行賦值,在 strict 模式下會報錯,非 strict 模式下靜默失敗。

iife中的函式是函式表示式,而不是函式宣告。

實際上,有點類似於以下**,但不完全相同,因為使用const不管在什麼模式下,都會typeerror型別的錯誤

const foo = function

() (foo)()

//uncaught typeerror: assignment to constant variable.

幾個例子:

var b = 10;

(function

b() ,拿此b做賦值;

//iife的函式無法進行賦值(內部機制,類似const定義的常量),所以無效。

//(這裡說的「內部機制」,想搞清楚,需要去查閱一些資料,弄明白iife在js引擎的工作方式,堆疊儲存iife的方式等)

b = 20;

console.log(b);

//[function b]

console.log(window.b); //

10,不是20

})();

所以嚴格模式下能看到錯誤:uncaught typeerror: assignment to constant variable

var b = 10;

(function

b() )()

//"uncaught typeerror: assignment to constant variable."

其他情況例子:

window

var b = 10;

(function

b() )();

var:

var b = 10;

(function

b() )();

IIFE 立即執行函式表示式

原文 iife 的原理,我簡單說一下 function foo 這是定義,declaration 定義只是讓直譯器知道其存在,但是不會執行。foo 這是語句,statement 直譯器遇到語句是會執行它的。iife 並非必須,傳統一點可以這麼寫 function foo foo 那麼為什麼要 iif...

立即執行函式表示式IIFE

一 iife解釋 全拼imdiately invoked function expression,立即執行的函式表示式。像如下的 所示,就是乙個匿名立即執行函式 function window,undefined window 二 括號的意義 2.1 包住function 的括號的意義 這個括號的目...

函式表示式

函式定義有以下兩種方式 一種是函式宣告,一種是函式表示式。函式宣告 在執行 之前會先讀取函式宣告,即函式宣告提公升。函式表示式 常用語法形式是常規的變數賦值語句,即建立乙個匿名函式並賦值給乙個變數。函式表示式在使用之前必須賦值,否則會出錯,這點與函式宣告提公升不同。能夠將匿名函式作為其他函式的值進行...