下面的**列印什麼內容,為什麼?
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 的括號的意義 這個括號的目...
函式表示式
函式定義有以下兩種方式 一種是函式宣告,一種是函式表示式。函式宣告 在執行 之前會先讀取函式宣告,即函式宣告提公升。函式表示式 常用語法形式是常規的變數賦值語句,即建立乙個匿名函式並賦值給乙個變數。函式表示式在使用之前必須賦值,否則會出錯,這點與函式宣告提公升不同。能夠將匿名函式作為其他函式的值進行...