2017-08-05 31 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

相关问题