函数的预编译
首先我们需要了解javaScript函数预编译过程:
1、创建AO对象(执行期上下文 ),寻找函数形参和变量声明。
2、把形参和变量名作为AO属性名,值为undefined。
3、把实参赋给形参,实参形参相统一。
4、寻找函数声明,赋值函数体。
5、函数开始执行。
代码实例
function fun(zhang){
console.log(zhang);
var zhang = '小张';
consoloe.log(zhang);
function zhang(){return "小张真好看"}
console.log(zhang);
var wang = function() {return "小王也好看"}
console.log(wang);
function li(){return "小李也好看"}
}
fun("小张说")
执行结果如下:
执行过程:
计算机执行到fun()函数时,在执行的前一刻会创建一个AO对象。
ao{
}
这是第一步,创建了一个ao对象。
第二步是将函数内所有的形参和变量声明储存到ao对象中,value值为undefined;
第三步将形参和实参进行统一。
也就是函数fun内的所有函数声明提前到fun最顶部,函数提升
可以看到第七行:
var wang = function() {return “小王也好看”}
这是一个函数表达式,不是函数声明。
这里预编译结束,函数开始一行一行的执行,遇到console.log命令就打印结果。
JavaScript中常用的函数类型
1、可变函数
<script>
function show(){
alert("第一个。。。");
}
function show(str){
alert("第二个");
}
function show(a,b){
alert("第三个。。。");
alert(a+":"+b);
}
</script>
<script>
show();//当调用之后,会把前面的冲掉 //undefined:undefined
show(111);//当调用之后,会把前面的冲掉 // 11:undefined
show("a","b");//当调用之后,会把前面的冲掉//a:b
show(1,2,3,4);//1:2
</script>
可变参数的函数: 在js中都是可变参数的函数
1 函数虽然定义时是声明成两个参数,但调用时却是可以传入任意个
2 每个函数中,存在一个 默认的数组arguments ,里面存储着本次调用时传入的所有实参
2、匿名函数
<script>
var res =function(a,b){
return a+b;
};
alert("sum="+res(1,2));//sum=3
alert("res="+res("abc","def"));//res=abcdef
</script>
错误的匿名函数
function(a,b){
return a+b;
};
怎么解决?
可以通过运算符:+ - !
但是只能这三个才可以实现
+
function(a,b){
return a+b;
}
-
function(a,b){
return a+b;
}
!
function(a,b){
return a+b;
}
3、动态函数(也叫构造函数)
利用Js当中内置的对象Function来构造一个函数,构造方法中的第1个参数是“形参”,第2个参数是“函数体”。
<script>
var res=new Function("x,y","var sum=0;sum=x+y;return sum;")
var sum=res(12,34);//46
var sum=res("abc","bss");//abcbss
alert("sum="+sum);
</script>
思想类似于Java当中的类反射。我们平时写函数时通常不用,但关键的地方一写,整个程序的功能会变得很活