更新时间:2018年09月21日17时19分 来源:传智播客 浏览次数:
1
|
ECStack = []; |
1
2
3
|
ECStack = [ globalContext ]; |
1
2
3
4
5
6
|
( function foo(bar) { if (bar) { return ; } foo( true ); })(); |
01
02
03
04
05
06
07
08
09
10
11
12
|
// 第一次foo的激活调用 ECStack = [ <foo> functionContext globalContext ]; // foo的递归激活调用 ECStack = [ <foo> functionContext – recursively <foo> functionContext globalContext ]; |
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
eval( 'var x = 10' ); ( function foo() { eval( 'var y = 20' ); })(); alert(x); // 10 alert(y); // "y" 提示没有声明 ECStack的变化过程: ECStack = [ globalContext ]; // eval('var x = 10'); ECStack.push( evalContext, callingContext: globalContext ); // eval exited context ECStack.pop(); // foo funciton call ECStack.push(<foo> functionContext); // eval('var y = 20'); ECStack.push( evalContext, callingContext: <foo> functionContext ); // return from eval ECStack.pop(); // return from foo ECStack.pop(); |
01
02
03
04
05
06
07
08
09
10
11
12
|
function foo() { var x = 1; return function () { alert(x); }; }; var bar = foo(); bar(); // 1 eval( 'x = 2' , bar); // 传入上下文,影响了内部的var x 变量 bar(); // 2 |