《编写高质量代码--改善JavaScript程序的188个建议》学习记录(四)

Js中的函数
(一)函数的定义方式
函数有三种定义方式:
1:function语句
2:Function构造函数
3:函数直接量
三者的比较:
(1)function语句和函数直接量定义的函数拥有自己的作用域,但是函数构造函数的函数作用域需要动态确定,而不是在定义函数是确定的
(2)从时间角度审视,function语句和函数直接量定义的函数具有静态的特征,但是Function构造函数定义的函数具有动态的特性,这种解析机制的不同,必然会带来不同的执行效率。

(二)函数的arguments
arguments对象仅能在函数体内使用,它仅作为函数体内的一个私有成员存在,因此可以通过点号运算符来指定arguments对象所属的函数。
arguments对象中的每个元素实际上就是一个变量,这些变量用来存储调用函数时传递的实参数,通过arguments[]数组和已经命名的形参可以引用这些变量的值,使用arguments对象可以随时改变实参的值,例如:
function f(){
    for(var i = 0 ;i < arguments.length;i++){
    arguments[i] = i;
    alert(arguments[i]);
}
}
f(1,2,4);
arguments对象包含一个callee属性,它能够返回当前arguments对象所属的函数引用,这相当于在函数体内调用函数自身,在匿名函数中,callee属性比较有用,通过它在函数内部引用自身。例如:
function f(x,y,z){
    var a = arguments.length;
    var b = arguments.callee.length;
    if(a!=b){
       alert("参数不匹配");
}else{
    return x+y+z;
}
}
alert(f(1,2,3));

Function对象的length属性返回的是函数的形参个数,而arguments对象的length属性返回的是函数的实参个数,如果函数不是匿名函数,则arguments.callee等价于匿名函数
(三)闭包函数
闭包结构有两个比较鲜明的特性:
(1)封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口。
(2)持久性,对于一般函数来说,在调用完毕之后明细荣会主动注销函数,而对于闭包来说,在外部函数被调用之后,闭包结构依然保存在系统中,闭包中的数据依然存在,从而实现对数据的持久使用,例如:
function f(x){
    var a = x;
    var b = function(){
     return x;
}
return b;
var c = f(1);
alert(c());

使用闭包结构那个跟踪动态环境中数据的实时变化,并及时存储。如:
function f(x){
    var a = x;
    var b = function(){
      return a;
};
   a++;
   return b;
}
var c = f(5);
alert(c());   //此时弹出的值是6
但是如果把函数f中的闭包结构去掉,那么就会得不到希望得到的结果。
function f(x){
    var a = x;
    var b = a;
    a++;
    return b;
}
var c= f();
alert(c());
}

你可能感兴趣的:(《编写高质量代码--改善JavaScript程序的188个建议》学习记录(四))