javascript 函数篇

来源:互联网 发布:农业财政支出数据 编辑:程序博客网 时间:2024/05/21 10:28
javascript的函数无法确定参数的具体类型和个数,如有指定需求,则用typeof进行检测

嵌套函数,函数的定义嵌套在其他函数内。

函数直接量可以用来定义函数。它被用作表达式,无需指定函数名。

函数命名规则参见java规则。


函数的参数
可选参数:当调用一个函数的参数少于声明参数的个数的时候,一个其他参数就有一个undefinded值。要做到这些,必须为参数设置合理的默认值。
参数长度:在一个函数体内,标示符arguments具有特殊含义。它是引用arguments对象的一个特殊属性。Arguments对象是一个类似数组的对象,可以按照数目来获取传递给函数的参数值。
   注意:可变参数函数不需要允许通过0参数方式调用。使用arguments[]对象来编写这样的函数:期待固定数目的具有名字的且必须的函数,紧接着是任意数目的没有命名的可选参数,这绝对是合理的。如果arguments被当做参数来使用,它会隐藏对Arguments对象的引用。
   属性callee,来引用当前正在执行的函数,它允许对未命名函数来递归的调用自身。
   例:function(x){if(x<=1)return 1; return x*arguments.callee(x-1);}
  
把对象属性用作参数

参数类型

构造函数
初始化一个对象的属性并且专门和new运算符一起使用的一个函数。

函数的属性和方法
属性length,函数在定义时的形参的个数


函数的作用域和闭包
javascript的函数是通过词法来划分作用域的,即他们在定义他们的作用域里运行


嵌套的函数是指在函数内部定义,并被调用的函数。示例:
function getarea(a,b){
     function square(x){return x*x;}
     return Math.sqrt(square(a)+square(b));
}

getarea(7,8);

结果:10.63014581273465
function getarea(a,b){     function square(x){return x*x;}     return Math.sqrt(square(a)+square(b));}getarea(7,8);
function getarea(a,b){     function square(x){return x*x;}     return Math.sqrt(square(a)+square(b));}getarea(7,8);
function getarea(a,b){     function square(x){return x*x;}     return Math.sqrt(square(a)+square(b));}getarea(7,8);
由于函数是一个变量,所以可以用直接的字符变量来存储函数。例如var f=function(x){},调用时可以用f(x)

一个代码小技巧: var c; c=c||0;

结果:0

一个函数在使用时,实际参数个数少于形参个数,不足部分用undefined补足.
下面一个函数,可以判断实际参数的个数:
javascript: function f(a,b,c,d){     if(arguments.length!=4){       throw new Error("this function needs four arguments!");     }  }    f(1);

结果:Error: this function needs four arguments!
[在此错误处中断] 

throw new Error("this function needs four arguments!");
通过以上示例可以得到:arguments代表函数的实参数组,只能在函数内部适应,是函数对象的一个属性
javascript: function fun(x){     console.log(x);     arguments[0]=100;     console.log(x);  }    fun(10);
这样可以改变x的值,结果为:10      100

把对象属性作为参数,参见java.

由于javascript是一种对数据类型非常宽松的,因此需要严格数据类型的时候需要进行类型检测和数据转化.

通过函数直接量,函数可以作为对象的属性,普通的变量.使用参见函数直接量.

this在javascript中代表引用当前对象,在全局中使用,代表对全局对象的引用,在函数内部表示对当前函数的引用,在dom节点中表示对当前节点的引用.



函数的属性和方法
   用typeof作用于一个函数的时候,会返回function类型.它是js的一个特定类型,具有本身的属性和方法.

属性length的应用,检查参数

javascript: function check(args){       var actual=args.length;       var expected=args.callee.length;       if(actual!=expected){          throw new Error("Wrong number of arguments:expected: "+expected+";actually passed "+actual);       }  }    

function f(x,y,z){      check(arguments);      return x+y+z;  }    f(1,2);

结果:Error: Wrong number of arguments:expected: 3;actually passed 2
[在此错误处中断] 

...new Error("Wrong number of arguments:expected: "+expected+";actually passed "+ac...


函数的方法call()和apply().

调用格式    函数直接量.call(函数对象,参数列表)
                   函数直接量.apply(函数对象,[参数序列])

函数作用域和闭包

所谓“闭包”,就是在构造函数体内定义另外的函数作为目标对象的方法函数,而这个对象的方法函数反过来引用外层函数体中的临时变量。

闭包的应用场景

  1. 保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
  2. 在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
  3. 通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)
 

闭包就是运用函数的内部作用域与外部作用域的差异,来实现封装函数内部数据,只可以根据特定的内部函数来实现引用.
var ide=(function(){
    var innerid=0;
    var data=function(){ return id++;};
    return data();
})();

原创粉丝点击