我準備面試的一個JS開發人員,我碰到了這個封閉的定義:是在全局範圍內聲明一個閉包的函數嗎?
閉包是一個功能內定義的另一個功能(稱爲父函數),訪問到父函數作用域中聲明和定義的變量。
讓我們考慮兩種不同的代碼片段:
function a() {
const temp = 1;
function b() {
console.log(temp);
}
}
所以很明顯的作用b
是一個封閉的,因爲它是內部功能a
聲明,並已獲得其可變temp
。
但如果我聲明只是就這樣的功能,沒有IIFE:
function c() {
alert("Hi") // a function taken from the global scope
}
我c
功能沒有任何函數內聲明的,但它可以訪問全球範圍內。它可以被稱爲閉包,還是應該在另一個函數中專門聲明被稱爲閉包?
也許有一些反常的情況下,我也沒多想複製內部明確聲明,但技術上講,你聲明的每一個函數都是一個閉包。您通常只會調用它們,當您想強調它訪問在其父範圍中聲明的變量時。 – ASDFGerte
閉包有三個作用域鏈,它們是自己定義的變量,封閉函數和全局變量。你的第二個例子只有局部和全局範圍鏈,所以不是,它不是閉包。 – James
我在規格上不夠精通,無法確定我的答案。然而,從我讀的[ECMAScript函數對象封裝了參數化的ECMAScript代碼**關閉了一個詞法環境並支持該代碼的動態評估。](https://www.ecma-international.org/ecma-262/ 8.0/index.html#sec-ecmascript-function-objects)[全球環境是一個沒有外部環境的詞法環境。](https://www.ecma-international.org/ecma-262/8.0/ index.html#sec-lexical-environments)[MDN定義](https://developer.mozilla.org/en/docs/Web/JavaScript/Closures) – ASDFGerte