簡體   English   中英

為什么記錄的是命名的 IIFE 而不是同名的變量?

[英]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 中

  1. 如果 envRec 中 N 的綁定是可變綁定,請將其綁定值更改為 V。
  2. 否則,這必須是嘗試更改不可變綁定的值,因此如果 S(正在使用嚴格模式)為 true 則拋出 TypeError 異常。

但是直接在函數內部,函數名綁定是不可變的 - 請參閱函數定義

生產

FunctionExpression : function Identifier ( FormalParameterListopt ) { FunctionBody }

評估如下:

調用 envRec 的CreateImmutableBinding具體方法,傳入Identifier的 String 值作為參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM