首页 > js > js-function类型

js-function类型

作者:宋 翠婷

function类型
通常使用函数的两种定义方法:
例一:

function sum(sum1,sum2){
return num1+num2;
}

例二:

var sum = function(sum1,sum2){
return num1+num2;
};

其中例一和例二的表达方式几乎无差别,例子二定义了变量sum并将其初始化为一个函数。function后面没有函数名,这是因为使用了函数表达式定义函数时,没有必要使用函数——通过变量sum即可引用函数。另外,还要注意函数末尾有一个分号,就像声明其他变量一样。
“函数是对象,函数名是指针”;—- 估计和java的对象原理差不多,在不new 对象的情况,通过指向的方式进行。
没有重载
JS的函数参数都是放在一个叫做arguments的数组中,所以有没有重载就没有意义。
函数声明和函数表达式
函数声明:以function关键字开头,接着是必须的函数(变量)名和以逗号分隔的可选的参数列表,再接着就是以大括号封装的函数体。
函数表达式:在任何情况下都是其它JavaScript语句的一部分(比如赋值表达式等号的右侧、函数的参数)的函数被称为函数表达式。
解析器在向执行环境加载数据的时候。解析器会先解析函数声明,并使它在执行任何代码之前都可以使用;表达式要等到解析器执行到它所在的代码行,才会真正的被解析释放。
例子:

alert(sum(10,10)); 
function sum(num1, num2){ 
 return num1 + num2; 
} 

上面的代码可以正常运行,但是如果将上面的函数改成等价的函数表达式,那么就会执行报错
作为值的函数
因为函数本身就是一个变量,所以函数也可以作为值来使用。也就是说,不仅可以像传递参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。
函数内部属性
在函数内部,有两个特殊的对象:arguments 和 this。其中arguments对象中还有一个名叫callee的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。
例子:

function factorial(num){ 
 if (num <=1) { 
 return 1; 
 } else { 
 return num * factorial(num-1) 
 } 
} 

上面递归的算法导致函数执行与函数名 factorial 紧紧耦合在了一起。为可消除耦合性可以采用下面的写法:

function factorial(num){ 
 if (num <=1) { 
 return 1; 
 } else { 
 return num * arguments.callee(num-1) 
 } 
} 

在这个重写后的 factorial()函数的函数体内,没有再引用函数名 factorial。这样,无论引用
函数时使用的是什么名字,都可以保证正常完成递归调用。例如:
var trueFactorial = factorial;

factorial = function(){ 
 return 0; 
}; 
alert(trueFactorial(5)); //120 
alert(factorial(5)); //0 

您必须 [ 登录 ] 才能发表留言!