SOURCE

// 栈 first in last out (先进后出)

// 最开始有一个全局的上下文,当遇到函数执行的时候会创建一个上下文,上下文执行完毕就销毁


// 举个简单的例子

/**
 * stack 栈
 * 
 * 1. 全局上下文
 * 2. 遇到了console对象的log函数执行(创建了一个log上下文)
 * 3. 执行log上下文 输出了 ‘gloabl’ 执行完销毁
 * 4. 回到全局上下文, 遇到了a 函数执行,创建了a的执行上下文
 * 5. 在执行a的上下文的时候, 遇到了console.log函数,创建了console.log的执行上下文
 * 6. 输出‘a’, console.log的上下文执行完毕,销毁。回到了a函数的上下文
 * 7. 遇到了b函数的执行,创建了b的执行上下文。
 * 8. 在执行b函数的时候,遇到了console.log函数,创建了console.log函数的执行上下文
 * 9. 执行console.log的执行上下文,输出了‘b’
 * 10. console.log上下文执行完毕,console.log执行上下文销毁。
 * 11. 回到了b函数的执行上下文。 b函数执行完毕, b的执行上下文销毁。
 * 12. 回到了a函数的执行上下文。 a函数执行完毕,a的执行上下文销毁。
 * 13. 回到了全局上下文, 全局上下文执行完毕,销毁。
 */
function a () {
    console.log('a');
    b();
}

function b () {
    console.log('b');
}

console.log('gloabl');
a();





//  递归(建议画图理解)

// 斐波那契数列 1 1 2 3 5 8 13

/**
 * stack 栈
 * 
 * 1. 全局上下文, 遇到了getFeoBo函数执行, 创建了getFeiBo(3)的执行上下文
 * 2. 在执行的时候,遇到了getFeiBo(3-1) + getFeiBo(3-2), 创建了getFeiBo(3-1)的执行上下文
 * 3. 在执行getFeiBo(3-1)的时候,得到了结果1; 然后getFeiBo(3-1)这个上下文还没有执行完。
 * 4. 继续执行getFeiBo(3-1)遇到了getFeiBo(3-2);创建了getFeiBo(3-2)上下文。执行得到结果1;
 * 5. getFeiBo(3-2)上下文执行完上下文销毁。回到了getFeiBo(3-1)的上下文。得到结果2。上下文销毁
 * 6. 回到了getFeiBo(3)的上下文,执行完毕。销毁
 * 7. 回到了全局上下文, 遇到了console.log函数执行,创建了console.log的执行上下文。
 * 8. 输出结果2,全局上下文执行完毕, 销毁。
 */
function getFeiBo(n) {
    if(n == 1 || n == 2) {
        return 1;
    }
    return getFeiBo(n - 1) + getFeiBo(n - 2);
}
console.log(getFeiBo(3));



console 命令行工具 X clear

                    
>
console