当前位置: 首页 > 面试题库 >

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

越风史
2023-03-14
问题内容

我知道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函数时,它将解析为另一个作用域中的。

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

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



 类似资料:
  • 我试图使用web控制台获取页面上所有h2标记中的文本。 我所发现的就是使用每一种,我已经试过了 但是它返回

  • 我有一个使用SpringLDAP 1.3.1的应用程序。它在启动时在Spring上下文中创建LdapTemplate,并将其传递给我的应用程序。我连接的LDAP字符串实际上是一个VIP设备,后面有多个Active Directory服务器。 该应用程序用于创建组层次结构,并分几个步骤进行。首先,它创建任何新组,然后删除任何删除的组,然后更新和更改组,最后更新任何新组或移动组的父级。 在最后一步中,

  • 问题内容: 因此,可以说用户在与应用程序服务器不同的时区中通过其浏览器运行我的Web应用程序。我使用JavaScript的方法在客户端序列化日期。我通过Json发送产生的毫秒数,然后通过调用在服务器端创建Java Date对象。我将其存储在MySql上,检索它,通过调用Java 再次将其序列化,然后通过Json将其再次发送给客户端。 如果我用这些毫秒创建一个JavaScript Date对象,它将

  • 问题内容: 如果是这样,为什么会发生此错误?该对象不是或如图所示。 我使用调试我的应用,这张照片摄于。 快速配置: 感谢您的意见,现在我发现是,但新的问题是,如何使再次作品?我想返回如下字符串: 如何重新签署适当的方法? 我尝试了undefined ,不好。看到: 问题答案: JS中的每个对象是否都有toString()方法? 否。只有那些继承自(如所有普通对象一样)或自行定义(或从其自定义原型继

  • 我打字的时候 是物体吗? 谁能给我解释一下在java中每样东西都是一个对象?

  • 问题内容: 在C ++中,我最熟悉的语言通常是这样声明一个对象: 调用可以正常工作(忽略可能未初始化的事实)。其中的变量在class的范围内,因此除非我真的需要明确指出我是在指代类而不是参数,否则我不需要说。 现在,我正在尝试开始使用Java OOP。因此,我查找了如何定义类并尝试相同的事情: 它给了我。更改为可解决此问题,但是对每个变量执行此操作会使我的代码混乱很多。每个变量都需要吗?由于我找不