2017-08-05 71 views
1

我準備面試的一個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功能沒有任何函數內聲明的,但它可以訪問全球範圍內。它可以被稱爲閉包,還是應該在另一個函數中專門聲明被稱爲閉包?

+2

也許有一些反常的情況下,我也沒多想複製內部明確聲明,但技術上講,你聲明的每一個函數都是一個閉包。您通常只會調用它們,當您想強調它訪問在其父範圍中聲明的變量時。 – ASDFGerte

+0

閉包有三個作用域鏈,它們是自己定義的變量,封閉函數和全局變量。你的第二個例子只有局部和全局範圍鏈,所以不是,它不是閉包。 – James

+1

我在規格上不夠精通,無法確定我的答案。然而,從我讀的[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

回答

2

是否可以稱爲閉合

是的,但我會說這將創建(在其外部執行環境的變量)的關閉而認爲「是」關閉。

還是應該另一項功能被稱爲一個

How do JavaScript closures work?

+0

很明顯,我遇到的定義是錯誤的,對吧? –

+1

@ AdrianWydmanski - 是的。閉包通常在與Douglas Crockford的文章[* JavaScript中的私人成員](http://javascript.crockford.com/private.html)相同的上下文中引入。然而,封閉的這一方面是最有趣的(即它們的能力超越了創造它們的功能的生命),但它不是創造它們的必要條件。 – RobG

相關問題