函数基础篇1

来源:互联网 发布:已有淘宝账号怎么开店 编辑:程序博客网 时间:2024/05/16 17:00

1、函数的结构:

函数名、圆括号中包含的0个或多个形式参数、包含在花括号中的方法体

2、函数体中可有可无return语句,return 语句能够结束函数的运行。若return后无表达式或函数体中不包含return语句将返回一个undefined

3、嵌套函数:被嵌入的函数有可能只出现在嵌入函数的顶层,也就是说不能出现在语句块中,例如if、while等语句,这样的限制只针对function定义的函数,对于函数直接量无效,当然不同版本的js对嵌入函数定义的位置要求可能不同

4、函数直接量

function f(x){ //函数

return x*x;}

var f=function(x){ //函数直接量
return x*x:

};

var f=function fact(x){ //命名了名称的函数直接量,函数引用存储在了f中,而未存储在fact变量中,只是允许函数体用if(x<=1)return 1; //这个名字来引用自身

else return x*fact(x-1);

};

5、函数直接量一般用于使用一次而无需命名的函数

f[0]=function(x){return x*x;};//用函数直接量给数组元素或类似数组元素对象赋值

a.sort(function(a,b){return a-b;});//用函数直接量给形参赋值

var tensquared=(function(x){return x*x})(10);//定义调用函数直接量,实质上这是闭包的形式

6、函数命名:函数常用动词命名或以动词开头,首字母要小写,单词与单词之间用下划线或第二个单词首字母大写

7、函数参数:因js是宽松类型的,不能给函数的形式参数指定类型,向函数传递任意类型参数都是合法的,而且js也不会检查传递参数个数是否正确:若传递参数的个数多余形参个数,多余的参数将被忽略,若少于将补以undefined

8、可选参数:函数参数可选的并且调用的时候可以忽略他们,同时在定义的时候应给予合理的默认值

function copy(0,a){

a=a||[];

for(var property in o) a.push(property);

return a;

}

var a=copy(o);//因未给a传值,将采用空数组

copy(p,a);

同时注意:可选的参数只能定义在参数列表尾部

9、可变长度的参数列表:函数内部的arguments具有特殊的含义,引用Arguments对象的一个特殊属性。Arguments是一个类似数组的对象,可以通过数目(而非名字)获取传递给函数的参数值;Arguments对象的callee属性引用当前正在执行的函数

function max( ){

var m=Number.NEGATIVE_INFINITY;

for(var i=0;i<arguments.length;i++){

if(arguments[i]>m){

m=arguments[i];

return m;

}

}

var largest=max(1,10,100,2,3,6);

Argument对象非同寻常特性:当函数具有了命名参数的时候,Arguments对象的数组元素是存放函数参数局部变量的同义词

function f(x){

print(x);    //打印最初的x值

arguments[0]=null;

print(x); //打印null

}

callee属性应用:递归调用

function(x){

if(x<=0) return 0;

return x+arguments.callee(x-1);

}

10、把对象属性用作函数参数:当一个函数需要多个参数,对于程序员记住参数的顺序变得困难了,采用名字/值对的方式传递是个好办法

function copy(form,from_start,to,to_start,length)

function toCopy{
copy(args.form,args.from_start||0,args.to_start||0,args.length);

}

11、参数类型:js是宽类型语句,对于函数的参数不必指定类型,对传递过来的实际参数也不作类型检查,在注释中给出需要的类型是个好做法

function(/*number……*/)//无限多个number型参数

自定义代码中,一般检查参数类型以免传递的是不需要的类型而发生异常

function sum(a){

if((a instanceof Array)||(a&&typeof a=="Objec"&&"length"in a)){

var total=0;

for(var i=0;i<a.length;i++){

var element=a[i];

if(!element)continue;

if(typeof element =="number")total+=element;

else throw new Error("sum():elements must be numbers");

}

else throw new Error("sum( ):argument must be an array");

}

12、函数作为数据

用函数赋值:

function square(x){                //定义一个函数对象,并把这个对象赋给square变量,函数变量是用来引用函数的名字

return x*x;                             

}

var a=square;     //a同样引用函数对象

 

var o=new Object();

o.square=function(x){ //把函数直接量赋给了对象的属性

return x*x;};

y=o.square(16);

 

var a=new Array(3);

a[0]=function(x){return x*x;};//函数直接量作为数值赋给了数组元素,a[0]引用了函数对象

a[1]=20;

a[2]=a[0](a[1]);

 

函数用作参数:

计算:(2+3)+(4*5)

function add(x,y){return x+y;}

function subtract(x,y){return x-y;}

function multiply(x,y){return x*y;}

function divide(x,y){return x/y;}

function opertae(operator,operand1,operand2){

return operator(operand1,operand2);

}

var i=operate(add,operate(add,2,3),operate(multiply,4,5));

 

var operators={

add:function(x,y){return x+y;},

substract:function(x,y){return x-y;},

multiply:function(x,y){return x*y;},

divide:function(x,y){return x/y;}

}

function opertate2(op_name,operand1,operand2){

if(typeof operators[op_name]=="function")

return operators[op_name](operand1,operand2);

else throw "unknow operator";

}

同样可计算:

var j=operatef2(add,operate2(add,2,3),operate2(multiply,4,5));

13、作为方法的函数:方法只不过是存储在对象的属性中,并且通过对象调用的js函数

var calculator={
operand1:1,

operand2:1,

compute:function(){
this.result=this.operand1+this.operand2;//this被传到嵌套方法中,指代函数对象本身

}

}

注:当函数作为函数而非方法,那么this指代全局对象

14、length属性:arguments数组length属性指代实际传递参数个数;Function的length是指参数列表中元素个数

 

 

 

 

 

 

 

 

 

原创粉丝点击