gpt4 book ai didi

Javascript 闭包 : Inconsistent reuse of variable

转载 作者:行者123 更新时间:2023-11-30 07:12:43 24 4
gpt4 key购买 nike

1) 为什么在 JavaScript 中存在这种不一致 - 我期望第四行也返回 11:

(function(n, m) { n = n + m; return n })(3, 8)                         == 11
(function(n, m) { var n = n + m; return n })(3, 8) == 11

(function(n) { return function(m) { n = n + m; return n } })(3)(8) == 11
(function(n) { return function(m) { var n = n + m; return n } })(3)(8) == NaN

2) 我正在为 javascript 编写一种语言的编译器。我使用 var 来避免临时变量污染全局空间。上面刚好我的临时变量是n,覆盖没问题。
是否有另一种方法可以让我(重新)定义 n,如果之前没有定义 n,它仍然认为 n 是本地的?

以下两个变体使用 tmp 污染了命名空间,我想避免这种情况:

(function(n, m) { tmp = n + m; return tmp })(3, 8)                     == 11
(function(n) { return function(m) { tmp = n + m; return tmp } })(3)(8) == 11

最佳答案

在你的第四个例子中:

(function(n) { return function(m) { var n = n + m; return n } })(3)(8) // == NaN

...您已使用局部声明隐藏 外部函数的n 参数。由于您没有为该局部变量提供任何初始值设定项,因此其默认值为 undefinedundefined 加上任何数字都是 NaN

您可能想知道为什么这与您的第二个示例不同:

(function(n, m) { var n = n + m; return n })(3, 8) // == 11

答案是范围。在第二个示例中,var n 出现在 n 参数已经存在的范围内,因此不会隐藏它(使用 var 和与相同范围内的参数相同的标识符是无操作)。但在第四个示例中,var n 出现在参数 n 存在的嵌套 范围内。因此它隐藏了父 n

这里,var 不做任何事情,因为范围内已经有一个 n:

function foo(n) {
var n;
console.log(n);
}
foo(42); // 42

但在这里,它确实:

function foo(n) {
(function() {
var n;
console.log(n);
})();
}
foo(42); // undefined

...因为参数和 var 在不同的范围内。

The following two variants pollute the namespace with tmp, which I want to avoid

不需要tmp(尽管local tmp 就可以了)。如果你想要一个嵌套函数,只是不要在 n 上使用 var:

console.log(
(function(n) { return function(m) { n = n + m; return n } })(3)(8) // == NaN
);

也就是说,local tmp(使用 var)并不是坏事:

console.log(
(function(n) { return function(m) {
var tmp = n + m;
return tmp;
}})(3)(8) // == 11
);

...但你必须声明它。如果没有 var 声明它,代码就会成为 The Horror of Implicit Globals 的牺牲品。 *,你确实想避免。 :-)


* (这是我贫血的小博客上的帖子)

关于Javascript 闭包 : Inconsistent reuse of variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47947692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com