[英]Closures and ES2015
我提前為另一個封閉問題道歉,但我想澄清一下我對JavaScript中實現閉包的方式的理解。
請考慮以下代碼:
01 'use strict';
02 function foo() {}
03 foo();
我在今年早些時候在一個問題中建立了一個閉包在概念上(如果不是實際上由於引擎優化)在這里創建的。
並且在第3行調用foo
之前,不會創建相應的執行上下文。
因此,據我所知,在評估此代碼時:
FunctionCreate
,將引用(名為“scope”)傳遞給當前執行上下文的“LexicalEnvironment”組件。 (19年1月14日) FunctionCreate
調用FunctionInitialize
傳遞“scope”(9.2.5) FunctionInitialize
確保正在創建的函數對象的[[Environment]]內部插槽設置為“scope”的值(對當前執行上下文的“LexicalEnvironment”組件的引用)(9.2.4) 最后,當實際調用foo
時,我發現規范難以解釋。
PrepareForOrdinaryCall
,調用的新執行上下文的“LexicalEnvironment”被設置為調用NewFunctionEnvironment
(9.2.1.1)的結果 NewFunctionEnvironment
將對外部執行上下文(函數對象的[[Environment]]槽的“LexicalEnvironment”組件的引用復制到正在構建的執行上下文的“LexicalEnvironment”組件的Environment
記錄( EnvironmentRecord
?)中“外部詞匯環境參考”(8.1.2.4) 因此,閉包以兩步方式實現:
EnvironmentRecord
(?)新執行上下文的“LexicalEnvironment”組件的子組件。 聽起來不錯嗎?
聽起來不錯嗎?
差不多。 我只是不會使用“復制”的工作,而是“鏈接”。 為了簡化它:
或者在圖片中:
+----------------+ +----------------+
Function | | [[Environment]] | Outer |
creation | Function |-------------------->| Environment |
| | | |
+----------------+ +----------------+
^
|
|
+----------------+ |
Function | Function | outer environment reference |
execution | Environment |------------------------------+
| |
+----------------+
每個函數都會發生這種情況,並且根據您對閉包1的定義,這會使每個函數成為閉包(或不閉包)。
1:我相信有兩個關於函數成為閉包的意義:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.