这个问题涉及到三个点:
1. 执行上下文
2. 函数嵌套导致的执行上下文栈
3.闭包
1 <script>
2 var a = 1;
3 var f1 = function(){//第一个函数
4 var a = 2;
5 var b = 1;
6
7 var f2 = function(){//第二个函数
8 var c = 1;
9 var f3 = function(){//第三个函数
//第三个函数执行,他自己的执行上下文中没有a,b,c,则从父级函数f2的执行上下文中去找,f2中有c,但是没有 a b,
//继续去f2的父级函数f1的执行上下文中去找,找到了 a b ,所以结果是 2,1,1
10 console.log(a,b,c);//2,1,1
11 }
12 f3();
13 }
14 f2();
15 console.log(a,b);//2,1
16 console.log(c);//报错:c 未定义
17 }
18 f1();
//f1执行,产生执行上下文,执行上下文中有 a b 所以 console.log(a,b)结果是 2,1
//但是没有c,所以去f1的父级函数(全局执行上下文)中找,还是没有c,那么console.log(c)就报错
按照栈中的顺序展示执行上下文内容
---------------------f3函数执行上下文------------------------------
变量:
函数
-----------------------------------------------------------------
---------------------f2函数执行上下文------------------------------
变量: c = 1;
函数: f3;
-----------------------------------------------------------------
---------------------f1函数执行上下文------------------------------
变量: a = 2 b = 1;
函数: f2;
------------------------------------------------------------------
---------------------全局执行上下文---------------------------------
变量: a = 1
函数 f1;
------------------------------------------------------------------
19</script>
概念:
1. 全局代码(一打开这个页面,就会执行的代码)一执行,就会产生一个 "全局执行上下文", 有且只有一个
2. 函数代码一执行, 就会产生一个"函数执行上下文" ,可以有多个
3. 执行上下文中存放的是代码中的 "变量" 和 "函数";他们是代码执行的原料
4. 执行上下文会提供代码运行时需要的各个数据的值
5. 函数嵌套调用形成执行上下文栈
原文:http://www.cnblogs.com/jiangnanxidao/p/5747608.html