[英]Why is the named IIFE logged instead of the variable with the same name?
我看到下面有人發布的代碼。 我對它記錄的內容感到困惑。 它記錄函數a
,而不是200
。 為什么?
var a = 1; (function a() { a = 200; console.log(a) })()
因為被立即調用的函數被命名為,並且該名稱不能重新分配以直接引用 IIFE 中的其他內容。
任何命名函數表達式也將表現出這種行為。 函數名為a
函數表達式意味着直接在函數內部的a
將始終引用函數本身,即使您嘗試重新分配它。
如果使用嚴格模式,則可以使錯誤顯式:
'use strict'; var a = 1; (function a() { a = 200; console.log(a) })()
未捕獲的類型錯誤:賦值給常量變量。
擁有一個命名函數表達式有點像擁有
(function a() {
const a = <this function>;
// ...
})()
除了嘗試重新分配它只會在嚴格模式下拋出。
具體來說,我相信此行為的 ECMAScript 5 規范在SetMutableBinding 中:
- 如果 envRec 中 N 的綁定是可變綁定,請將其綁定值更改為 V。
- 否則,這必須是嘗試更改不可變綁定的值,因此如果 S(正在使用嚴格模式)為 true 則拋出 TypeError 異常。
但是直接在函數內部,函數名綁定是不可變的 - 請參閱函數定義:
生產
FunctionExpression : function Identifier ( FormalParameterListopt ) { FunctionBody }
評估如下:
調用 envRec 的CreateImmutableBinding具體方法,傳入
Identifier
的 String 值作為參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.