JavaScript方法在调用执行的时候不会立即执行,而是会经过一层一层的解析再执行。
通过一个面试题例子来看:
function f(age) {
console.log(age);
var age = 2;
console.log(age);
function age() {}
console.log(age);
}
f(1);
问:调用f的过程中,后台console三次分别弹出了什么?
答案是:
function age() {} ; 2 ; 2
我们知道JavaScript函数在调用之前不会立即执行,
在形成调用瞬间存在一个active object(以下简称ao)。
他会根据3个过程分析:
形式参数——局部变量——声明表达式。
而且在每步骤的最前面,会先把所有的变量先声明为undefined。
以此来看:
1、解析形式参数,此时在内存中从上到下依次会产生这两个形式参数的定义:
ao.age = undefined;
ao.age = 1;
2、解析局部变量:这个过程中,因为在上一步有了age的定义,所以他不对age做任何改变(这是规定的):
所以ao.age = 1;
3、解析函数声明表达式,此时age变成了一个函数声明,所以:
ao.age = function();
注意,此刻还没执行,现在age就是一个function!
所以当他调用的时候,执行第一句第一个打印出来的是function age() ,然后执行了赋值age=2,所以后面2个都是2。
结果: