JavaScript中的每个函数是否都是闭包,这是真的吗?

我知道JavaScript中的每个函数都是一类对象,并且它具有内部属性[[scope]],该属性承载该函数的自由变量的绑定记录。但是,有两种特殊情况。

  1. 由Function构造函数创建的函数也是闭包吗?由函数构造函数创建的函数对象是特殊的,因为其[[scope]]可能不引用其外部函数的词法环境,而仅引用全局上下文。例如,

var a = 1; 

var fn = (function outer() {

var a = 2;

var inner = new Function('alert(a); ');

return inner;

})();

fn(); // will alert 1, not 2.

这是不直观的。这也称为关闭吗?

  1. 如果内部函数没有任何自由变量,我们可以说创建内部函数时形成了闭包吗?例如,

// This is a useless case only for academic study

var fn = (function outer() {

var localVar1 = 1,

localVar2 = 2;

return function() {};

})();

在这种情况下,fn引用一个作为内部函数创建的空函数对象。它没有自由变量。在这种情况下,我们可以说形成了闭合吗?

回答:

由Function构造函数创建的函数也是闭包吗?

是的,它关闭了全球范围。这可能是不直观的,因为所有其他JavaScript闭包都超出了其词法范围,但仍与我们对闭包的定义相匹配。在您的示例中,a是一个自由变量,a当在某处调用inner/fn函数时,它将解析为另一个作用域中的。

如果内部函数没有任何自由变量,我们还能称其为闭包吗?

取决于您问谁。有人说“是”,其他人则称它们为“无趣的闭包”,我个人之所以说“否”是因为它们没有引用外部作用域。

以上是 JavaScript中的每个函数是否都是闭包,这是真的吗? 的全部内容, 来源链接: utcz.com/qa/432092.html

回到顶部