更新時間:2018年09月21日17時19分 來源:傳智播客 瀏覽次數(shù):
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的激活調(diào)用 ECStack = [ <foo> functionContext globalContext ]; // foo的遞歸激活調(diào)用 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); // 傳入上下文,影響了內(nèi)部的var x 變量 bar(); // 2 |