我准备面试的一个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