![](/img/trans.png)
[英]How to make a function like add(num1)(num2)(num3) to continuously add numbers?
[英]How is the original num2 updated in this fibonacci instance?
我已經獲得了一個代碼實例,並希望對其進行解釋。
function fib(num1, num2, stop) {
var num3 = num1 + num2;
console.log(num3);
if(stop === 0) {
return;
}
fib(num2, num3, stop - 1);
}
fib(0, 1, 6)
雖然似乎我得到了所有這些,但我似乎無法理解參數 num2 是如何不斷更新到下一個數字的。
謝謝!
PS這是我第一次在stackoverflow上發帖,如果有人對如何改進這篇文章有任何提示。 我會很感激的。
參數 num2 如何不斷更新到下一個數字。
實際上num2
永遠不會更新。 然而,每次遞歸執行fib
都會引入一個同名的新變量。 它從調用者那里獲得它的價值。 一旦它具有該值,它就永遠不會改變。 但是,您獲得的具有該名稱num2
的變量與對fib
的調用一樣多。
現在注意如何進行遞歸調用:
fib(num2, num3, stop - 1);
然后檢查這些 arguments 是如何收到的:
function fib(num1, num2, stop) {
請注意,調用者的num3
成為被調用者的num2
的初始值。 這給人的印象是num2
在整個程序中都在變化,但實際上每次“變化”發生時它都是一個新變量,並且初始值始終是num3
在調用執行上下文中的值。
下圖中的每個“框”代表fib
的單個執行上下文。 它是一組局部變量的容器。 這些保持不變,但對 function 進行了更深入的調用,因為這將導致一組新變量的另一個上下文(容器):
fib(0, 1, 6)
+-------- new execution context ---------------------------------------------+
| // num1 = 0, num2 = 1, stop = 6 |
| var num3 = num1 + num2; // = 1 |
| fib(num2, num3, stop - 1); |
| +------ new execution context ----------------------------------------+|
| | // num1 = 1, num2 = 1, stop = 5 ||
| | var num3 = num1 + num2; // = 2 ||
| | fib(num2, num3, stop - 1); ||
| | +------ new execution context ---------------------------------+||
| | | // num1 = 1, num2 = 2, stop = 4 |||
| | | var num3 = num1 + num2; // = 3 |||
| | | fib(num2, num3, stop - 1); |||
| | | +------ new execution context --------------------------+|||
| | | | // num1 = 2, num2 = 3, stop = 3 ||||
| | | | var num3 = num1 + num2; // = 5 ||||
| | | | fib(num2, num3, stop - 1); ||||
| | | | +------ new execution context -------------------+||||
| | | | | // num1 = 3, num2 = 5, stop = 2 |||||
| | | | | var num3 = num1 + num2; // = 8 |||||
| | | | | fib(num2, num3, stop - 1); |||||
| | | | | +------ new execution context ------------+|||||
| | | | | | // num1 = 5, num2 = 8, stop = 1 ||||||
| | | | | | var num3 = num1 + num2; // = 13 ||||||
| | | | | | fib(num2, num3, stop - 1); ||||||
| | | | | | +------ new execution context -----+||||||
| | | | | | | // num1 = 8, num2 = 13, stop = 0 |||||||
| | | | | | +----------------------------------+||||||
| | | | | +-----------------------------------------+|||||
| | | | +------------------------------------------------+||||
| | | +-------------------------------------------------------+|||
| | +--------------------------------------------------------------+||
| +---------------------------------------------------------------------+|
+----------------------------------------------------------------------------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.