在 JavaScript 中,一个函数的执行过程分为两个阶段:(1)建立执行环境;(2)执行函数代码。
在建立执行环境(execution context)的阶段,函数将初始化各种变量,并将它们记录在一个内部的变量对象(variable object)中。记录在该变量对象中的变量依次有下面三种:(a)函数的实际参数;(b)内部的函数声明;(c)内部的变量定义。这个阶段结束之后前面两种变量有了具体的值,而最后一种变量的值总是 undefined。在执行函数代码阶段,当函数执行到 var 语句时,这种变量才有了具体的值。例如:
function hello(a) { alert(a+b()); // HelloWorld alert(c); // undefined alert(d); // undefined var c = "Some"; var d = function() { return "Thing"; } alert(c+d()); // SomeThing function b() { return "World"; } } hello("Hello");
这里 b 是函数声明,因此可以在 hello 函数的开始时就使用;而 c 和 d 是变量定义,因此在对应的 var 语句之后才有具体的取值。
JavaScript 这种特点,使得在使用后面才声明或定义的变量时不会出错。
参考资料:
[1] ECMA-262-3 in detail. Chapter 2. Variable object
[2] ECMA-262-3 深入解析.第二章.变量对象
[3] 深入理解JavaScript系列(12):变量对象(Variable Object)