为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript中的每个函数都是对的吗?

JavaScript中的每个函数都是对的吗?

千万里不及你 2019-11-04 11:11:08
我知道JavaScript中的每个函数都是一流的对象,并且具有内部属性[[scope]],该属性承载该函数的自由变量的绑定记录。但是,有两种特殊情况。由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.这是不直观的。这也称为关闭吗?如果内部函数没有任何自由变量,可以说创建内部函数时形成了闭包吗?例如,// This is a useless case only for academic studyvar fn = (function outer() {    var localVar1 = 1,        localVar2 = 2;    return function() {};})();在这种情况下,fn引用一个作为内部函数创建的空函数对象。它没有自由变量。在这种情况下,我们可以说形成了闭合吗?
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

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


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


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


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


查看完整回答
反对 回复 2019-11-04
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

如果您遵循ES5规范,则的[[scope]]会inner存储的词法环境outer及其outera变量-因此所有内容仍然可以访问并记住。如果遵循实际的ES实现,并inner使用调试器进行检查,则看不到任何作用域引用-它不需要它们,因为没有可用变量。

查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 321 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信