变量提升和函数形参
JavaScript是自上向下执行的,但是在JS代码执行前,会首先进行语法分析,所以事实上JS运行要分为语法分析和执行两个阶段:
语法分析:
1、分析形参
2、分析变量声明(var)
3、分析函数声明(function)
具体执行步骤:
1当函数被执行时,首先创建活动对象AO(Active Object);
2找函数形参和声明,将变量和形参作为AO属性名,值为undefined
3接收函数实参,函数属性进行赋值 (这里对象里面的arguments[index]将会和第index个形参指向同一个地址)(arguments为实参列表)
4.分析函数声明,(没有的同名的变量或函数就进行声明,提升整个函数体;如果有同名的函数或者变量则进行覆盖)
例子:
function a(b){
console.log(b); //function b(){}
var b = 'huang';
console.log(b); //'huang'
arguments[0] = 1;
console.log(b); //1
console.log(c); //function c(){ console.log(41) }
function b() {};
function c(){console.log(6564)}
function c() {console.log(41)}
}
a(45);
它实际上的执行步骤是:
function a(b){
var b = undefined;
b = 45;
b = function b(){};
//function c() {console.log(6564)}
function c() {console.log(41)}
console.log(b);
b = 'huang';
console.log(b);
arguments[0] = 1;
console.log(b);
console.log(c);
}