day 06
作为值的函数
从一个函数返回另一个函数,是一种极为有用的技术。可用于数组对象进行排序。如下函数:
- function createComparisonFunction(propertyName)
- {
- return function(object1,object2){
- var value1 = object1[propertyName];
- var value2 = object2[propertyName];
- if(value1<value2){
- return -1;
- }else if(value1>value2)
- {
- return 1;
- }else{
- return 0;
- }
- };
- }
- var data = [{name:"nick",age:28},{name:"zack",age:25}];
- data.sort(createComparisonFunction("name"));
- alert(data[0].name);//nick,以名字name排序n<z
- data.sort(createComparisonFunction("age"));
- alert(data[0].name);//zack,以年龄age排序 25<28
函数内部属性
在函数内部,有两个特殊的对象:arguments和this。arguments是一个类数组对象,包含着传入函数中的所有参数。该对象还有个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。如下非常经典的阶乘函数:
- function factorial(num)
- {
- if(num<=1)
- {
- return 1;
- }else{
- return num*factorial(num-1);
- }
- }
- function factorial(num){
- if(num<=1)
- {
- return 1;
- }else{
- return num*arguments.callee(num-1);
- }
- }
- function factorial(num)
- {
- if(num<=1)
- {
- return 1;
- }else{
- return num*arguments.callee(num-1);
- }
- }
- var truefactorial = factorial;
- factorial = function(){
- return 0;
- }
- var x = truefactorial(3);//6而非0
- window.color = "red";
- var o = {color:"blue"};
- function printColor(){
- alert(this.color);
- }
- printColor;//red
- o.printColor = printColor;
- o.printColor();//blue
注:函数名仅仅只是一个包含指针的变量而已,即使在不同的执行环境中,全局的printColor与o.printColor指向的仍然是同一个函数。
函数属性和方法
ECMAScript中函数就是对象,因此也就有属性和方法。每个函数都包含两个属性:length和prototype,其中,length表示函数希望接收的命名参数的个数,如下:
- function sayName(name){
- alert(name);
- }
- function sum(num1,num2){
- return num1 + num2;
- }
- function sayHi(){
- alert("hi");
- }
- alert(sayName.length);//1
- alert(sum.length);//2
- alert(sayHi.length);//0
每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数。apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。第二个参数可以是Array的实例,也可以是arguments对象。如下:
- function sum(num1,num2){
- return num1 +num2;
- }
- function callSum1(num1,num2){
- return sum.apply(this,arguments);//传入arguments对象
- }
- function callSum2(num1,num2){
- return sum.apply(this,[num1,num2]);//传入数组
- }
- alert(callSum1(10,10));//20
- alert(callSum2(10,10));//20
call()方法与apply()方法的作用相同,区别在于接收参数的方式不同。call(),第一个参数是this值,其余的参数都直接传递给函数,即,使用call()方法时,传递给函数的参数必须逐个列举出来。apply()和call()真正的用处在于能够扩充函数赖以运行的作用域,如下:
- window.color = "red";
- var o = {color:"blue"};
- function sayColor(){
- alert(this.color);
- }
- sayColor();
- sayColor.call(this);//red
- sayColor.call(window);//red
- sayColor.call(o);//blue