javascript 箭头函数:我们可以像 C++ lambda 那样捕获值吗?

use*_*931 6 javascript c++ lambda arrow-functions

定义 C++ lambda https://en.cppreference.com/w/cpp/language/lambda时,有一个捕获块捕获封闭范围内变量的(至少如果变量是通过复制而不是通过捕获)参考)。因此,如果 lambda 使用已捕获的变量并且稍后执行 lambda,则 lambda 内的相应变量将具有定义 lambda 时的值。

使用 JavaScript 箭头函数,我可以引用封闭范围中的变量。但是,当调用箭头函数时,它将使用它现在拥有的变量的值(而不是定义箭头函数时它拥有的值)。

是否存在类似的变量捕获机制,允许使用箭头函数对象存储捕获的变量值?

这是一个 C++ 示例:

// Example program
#include <iostream>
#include <string>
#include <functional>

int main()
{
  std::function<void(int)> byCopyCaptures[5];
  std::function<void(int)> byRefCaptures[5];
  for(int i=0; i<5; i++) {
      // The variable i is captured by copy:
      byCopyCaptures[i] = [i](int j) {std::cout << "capture by copy: i is " << i << " and j is "<< j <<"\n";};
      // The variable i is captured by reference:
      byRefCaptures[i] = [&i](int j) {std::cout << "capture by ref:  i is " << i << " and j is "<< j <<"\n";};
  }
  for(int k=0; k<5;  k++) {
      byCopyCaptures[k](k);
      byRefCaptures[k](k);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

capture by copy: i is 0 and j is 0
capture by ref:  i is 5 and j is 0
capture by copy: i is 1 and j is 1
capture by ref:  i is 5 and j is 1
capture by copy: i is 2 and j is 2
capture by ref:  i is 5 and j is 2
capture by copy: i is 3 and j is 3
capture by ref:  i is 5 and j is 3
capture by copy: i is 4 and j is 4
capture by ref:  i is 5 and j is 4
Run Code Online (Sandbox Code Playgroud)

使用箭头函数的 JavaScript 等效项是什么?

Nic*_*wer 6

我想说最接近的等效方法是使用立即调用的函数表达式,并传入要锁定的值。由于代码现在访问函数参数而不是原始变量,因此对原始变量进行赋值没关系。例如:

let a = 'a';
let b = 'b';

((a, b) => {
  setTimeout(() => {
    console.log(a);
    console.log(b);
  }, 1000);
})(a, b);

a = 'new a';
b = 'new b';
Run Code Online (Sandbox Code Playgroud)

由于我对所有内容都使用了相同的名称,因此可能会有点混淆什么指什么,所以这里是具有唯一变量名称的相同内容:

let a = 'a';
let b = 'b';

((innerA, innerB) => {
  setTimeout(() => {
    console.log(innerA);
    console.log(innerB);
  }, 1000);
})(a, b);

a = 'new a';
b = 'new b';
Run Code Online (Sandbox Code Playgroud)