更新时间: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); // 10alert(y); // "y" 提示没有声明ECStack的变化过程:ECStack = [ globalContext];// eval('var x = 10');ECStack.push( evalContext, callingContext: globalContext);// eval exited contextECStack.pop();// foo funciton callECStack.push(<foo> functionContext);// eval('var y = 20');ECStack.push( evalContext, callingContext: <foo> functionContext);// return from evalECStack.pop();// return from fooECStack.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 |