具体步骤:
0:函数运行前的一瞬间,生成Active Object(活动对象),下称AO
1:1.1函数声明的参数,形成AO的属性,值全是undefined
1.2接收实参,形成AO相应的属性的值
2:分析变量声明声明!如var age,
如果AO上还没有age属性,则添加AO属性,值是undefined
如果AO上已经有age属性,则不做任何影响
3:分析函数声明,如function age(){},则把函数赋给AO.age属性
注:如果此前age属性已经存在,则被无情的覆盖了。
一,
function t(age){
alert(age)
}
t(5)//alert 5;
t()//undefined;
词法分析过程age为undefined;
t(5)——此法运行过程,赋值age为5;
二、
function t(age){
var age=99;
alert(age);
}
t(5);//alert 99
分析过程——1、形成AO={};2、分析形参age为undefined;3、分析var age,发现AO已有age属性,不做影响。
执行过程——AO.age=99;alert 99
三、
function t3(greet) {
var greet = "hello";
alert(greet);//hello
function greet() {
}
alert(greet);//hello
}
t3(null);
词法分析过程:
0:AO={};
1:分析参数AO={greet:undefined},分析接受形参AO={age:null}
2:分析greet变量声明,AO已经有greet属性,因此不做任何影响
3:分析greet函数声明,AO.greet=function(){},被覆盖成函数
执行过程:
greet="hello";
alert(greet);
alert(greet);
四、
function a(b) {
alert(b);//function b(){}
function b(){
alert (b);//function b(){}
}
b();
}
a(1);
词法分析过程:
0:AO={}
1:分析参数AO={b:undefined};接受形参b=1;
2:分析var b声明,没有
3:分析函数声明function b(){},覆盖b=1;
执行过程:
alert(b);
b();
五、
function a(b) {
alert(b);//1
b=function b(){
alert (b);//function b(){}
}
b();
}
a(1);
词法分析过程:
0:AO={}
1:分析参数AO={b:undefined};接受形参b=1;
2:分析var b声明,没有
3:分析函数声明,没有。。。注:b=function(){}是一个赋值过程,在执行期才有用。
执行过程:
alert(b);
b=function(){};
b();
六、
function b1(){
}//在词法分析阶段产生作用
b2=function (){
}//在函数运行阶段产生作用
七、
(function(window,undefined){})(window)
(function(window,undefined){})//内层表达式,返回值是函数,包在小括号里面,当成表达式来执行
(function(window,undefined){})()立即调用,这叫做匿名函数
优点是:立即执行,不污染全局变量
传window是为了速度,不传undefined是为了安全。