gpt4 book ai didi

javascript - 对于异步内部函数,外部函数的函数参数是否会发生变化?

转载 作者:行者123 更新时间:2023-12-03 12:41:29 25 4
gpt4 key购买 nike

我对这个主题感到困惑,这个主题在异步函数调用和闭包方面对我来说很重要。我肯定错过了 javascript 函数调用最重要的部分,并且到目前为止还找不到我的问题的答案,因此我希望得到您的帮助!

我的问题假设:

  1. 使用某个参数 i ( = 0 ) 调用外部函数 fDynamic
  2. fDynamic 对内部函数 fInnerQueued 进行排队,以便在将来的某个时间点调用。
  3. 同时,使用不同的参数 i ( = 1 ) 再次调用外部函数 fDynamic

这个新参数值现在对第一个内部函数 fInnerQueued 可见吗?该函数最终调用后会立即看到更改? ...好像不是?

函数参数似乎不是自由变量,并且即使通过异步调用也紧密绑定(bind)到函数调用范围。

这是一个fiddle本质是:

var j = 0;
var fDynamic = function( i ) {
j = i; // j seems to be a free variable, while i is not?
if( i == 0 ) {
// Delay execution in order to let i change to 1
var fInnerQueued = function() {
console.log(i + ' ('+ j + ')'); //should be "1 (1)" but is "0 (1)"
}
setTimeout( fInnerQueued, 100);
} else {
console.log(i); // is "1 (1)", right!
}
}; // Expected output "1 (1)", "1 (1)" but it is "1 (1)", "0 (1)"...
fDynamic(0);
fDynamic(1);

我也在 Node.js 上测试了它,并得到了相同的、有些意外的输出。

我爬遍了不同的帖子,但没有找到答案:

我知道我可以通过创建屏蔽闭包或使用绑定(bind)来省略麻烦。但我真的很想理解为什么函数参数不被视为内部函数的自由变量,甚至通过异步调用保留它们。

最佳答案

函数参数是局部作用域的变量。

function foo (x) {

}
foo(1);

大致相同

function foo () {
var x = 1;
}
foo();

不是

function foo () {
x = 1;
}
foo();

当您使用内部函数时,参数将被封闭。

再次调用该函数会在新作用域中创建一个新变量。

关于javascript - 对于异步内部函数,外部函数的函数参数是否会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23512716/

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