更新时间: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 |