【问题标题】:In this code, why I have to make outer function?在这段代码中,为什么我必须制作外部函数?
【发布时间】:2021-08-28 00:35:37
【问题描述】:

var arr = []
for (var i = 0; i < 5; i++) {
    arr[i] = function(id) {
        return function() {
            return id;
        }
    }(i);
}
for (var index in arr) {
    console.log(arr[index]());
}

我的想法: 'I' 在 (i) 中;将引用全局变量“I”。 'I' 在 (i) 中;将保存在函数(id)中的“id”中。 'id' 是外部函数的局部变量。内部函数中的“id”将引用外部函数的局部变量“id”。然后,结果是'0,1,2,3,4'。 但我想我可以在没有外部函数的情况下得到相同的结果。

var arr = []
for (var i = 0; i < 5; i++) {
    arr[i] = function(id) {
        return id;
    }(i);
}

for (var index in arr) {
    console.log(arr[index]());
}

在这种情况下,'I' 在 (i) 中;将引用作为全局变量的“I”。 'I' 在 (i) 中;将保存在函数的局部变量“id”中。 返回代码后面的“id”将引用“id”,它是函数的局部变量。然后,结果是'0,1,2,3,4'。 不需要像第一个代码那样使用外部函数,因为第二个代码是可能的。我说的对吗?

【问题讨论】:

  • 因为您使用的是var 而不是let
  • "我错了吗?" 显然第二个代码会引发错误,所以我猜答案是“是”。问题在于,在第二种情况下,您没有将 functions 分配为数组的成员,而是 execute 一个函数并分配结果。所以数组是[0, 1, 2, 3, 4] 不是返回这些值的函数。

标签: javascript closures


【解决方案1】:

你甚至可以不使用任何函数,只需设置arr[i] = i。但有件事告诉我,您已经简化了提供的代码,从而删除了使用这种模式的原因。

这种函数模式称为partial function application,您可以在其中将一些参数应用到一个函数并取回另一个较小数量的函数。 在您所展示的这种情况下,这种方法的一个好处是节省了稍后调用的结果函数的执行,但在此之前应用已知参数。

【讨论】:

  • 我认为这取决于您要完成的工作。您想要立即得到结果,还是只想应用一些参数并将结果的计算保存以备后用?如果没有理由推迟计算结果,我建议降低复杂性并立即设置结果。
猜你喜欢
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 2023-02-20
  • 2015-05-16
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多