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 等效项是什么?
我想说最接近的等效方法是使用立即调用的函数表达式,并传入要锁定的值。由于代码现在访问函数参数而不是原始变量,因此对原始变量进行赋值没关系。例如:
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)
| 归档时间: |
|
| 查看次数: |
6875 次 |
| 最近记录: |