以下 Javascript 程序:
function f() {
function g() { console.log(x); }
let x = 0;
g(); // prints 0
x = 1;
g(); // prints 1
return g;
}
let g = f();
g(); // prints 1
输出:
0
1
1
因此,似乎首先通过引用g捕获(因为在内部,然后在反弹时打印),这意味着闭包环境看起来像,然后通过值(因为在外部,在主体末尾脱离上下文时打印),这意味着闭包环境看起来像.x fg()01xg{'x': x}fg()1xfg{'x': 1}
我试图将此行为与 C++ lambda 相关联,后者提供按引用和按值捕获,但与 Javascript 相反,不允许按引用捕获通过转换为按值捕获(相反,调用lambda 变成未定义的行为)。
这是对 Javascript 捕获的正确解释吗?
如果这个解释是正确的,那将清楚地解释块作用域变量 ( let) 的捕获是如何在for循环中工作的:
let l = [];
for (let x = 0; x < 3; ++x) {
l.push(function () { console.log(x); });
}
l[0](); // prints 0
l[1](); // prints 1
l[2](); // prints 2
UYOU
慕沐林林
相关分类