function test(a, b) { var c = 20; function d(){} var e = function _e(){}; (function x(){}); } test(30);
当进入执行环境,VO如下:
VO (test FunctionContext) = { a: 30, b: undefined, d: <reference to FunctionDeclaration "d">, c: undeifined, e: undefined }
VO[‘c‘] = 20;
VO[‘e‘] = <reference to FunctionDeclaration "_e">;
alert(x); //function var x = 10; x = 20; function x() {} alert(x); //20
为什么第一个是function,而不是undeofined或者是not defined或者10、20?因为,根据规范 — 当进入上下文时,往VO里填入函数声明;在相同的阶段,还有一个变量声明“x”,那么正如我们在上一个阶段所说,变量声明在顺序上跟在函数声明和形式参数声明之后,而且,在这个阶段,变量声明不会干扰VO中已经存在的同名函数声明或形式参数声明,因此,在进入上下文时,VO的结构如下:
VO = {} VO[‘x‘] = <reference to FunctionDeclaration "x">; VO[‘x‘] = <the value is not disturbed, still function>
在代码执行阶段:
V[‘x‘] = 10;
V[‘x‘] = 20;
了解了这个过程,我相信对JS执行过程会有一个全新的理解。
原文:http://www.cnblogs.com/ricoliu/p/6248043.html