我對這個主題感到困惑,這對於我來說非常重要,就異步函數調用和閉包而言。我一定錯過了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