1、先创建一个AO对象;
2、将形参和变量变为AO对象里的属性,值为undefined;
3、实参赋值形参;
4、在函数体内找函数声明,值赋予函数体;
实例1:
// 1.创建AO对象; // AO{} // 2.形参,变量变为AO对象的属性,值为undefined // AO{ // foo:undefined // } // 3.3.实参赋值形参(因为没有实参,foo还是undefined); // AO{ // foo:undefined // } // 4.函数体内找函数声明,值赋予函数体; // AO{ // foo:foo(){ } // } // 直接返回foo的值foo(){ } function bar (){ return foo; foo = 10; function foo(){ } var foo = 11 } console.log(bar())
实例2:
// 1.创建AO对象; // AO{} // 2.形参,变量变为AO对象的属性,值为undefined // AO{ // foo:undefined // } // 3.实参赋值形参(因为没有实参,foo还是undefined); // AO{ // foo:undefined // } // 4.函数体内找函数声明,值赋予函数体; // AO{ // foo:foo(){ } // } // 5.此时函数预编译结束,属性foo的值还是foo(){ }; // 6.函数开始执行,执行到foo = 10时,foo属性值为10 // 7.function foo () { }已经被编译过了,继续往下执行 // 8.var foo = 11 ,将foo属性值10变为11; // 9.当return时候,返回的是11 function bar(){ foo = 10 ; function foo (){ } // var foo = 11 ; return foo } console.log(bar());