// 栈 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