我对这个主题感到困惑,这对于我来说非常重要,就异步函数调用和闭包而言。我一定错过了javascript函数调用中最重要的部分,到目前为止还无法找到我的问题的答案,因此我希望对您有所帮助!为异步内部函数执行外部函数更改的函数参数吗?
我的问题假定:
- 外功能
fDynamic
调用与一些参数i
(= O) fDynamic
队列内功能fInnerQueued
,要在某个时间点的未来调用。- 在外部函数
fDynamic
与不同的参数i
再次调用的平均时间(= 1)
一旦这是新的参数值现在到第一内功能fInnerQueued
这将看到的变化可见,因为它终于被调用? ...似乎不是?
看来,如果函数的参数是不是免费的变量,并紧密结合的函数调用范围甚至低谷异步调用。
这里有一个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的,并得到了相同的,有些出人意料,输出。
我通过不同的岗位抓取和没能找到答案:
- How do JavaScript closures work? & How does the outer function "store" the arguments for the inner function?:在异步上下文
- accessing outer caller function arguments没有解释:也不会在异步上下文
- Understanding closures: Constructing a meta-function that queues functions together :走向正确的方向,但这个问题仍然没有改变外部函数的论点。
我知道我可以通过创建屏蔽闭合或使用绑定来省略麻烦。但我真的很想理解为什么函数参数不被视为内部函数的自由变量,并且它们甚至通过异步调用来保留。
因此每个调用都会创建一个新的范围?我认为函数就像通过不同调用共享相同范围的实例。这是我不需要考虑的时候只使用同步的东西。 – Dominic
是的。每个函数调用都会创建自己的范围。 – Quentin