Function类型-作为值的函数

作为值的函数

  因为ECMAScript中的函数名本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以像参数一样把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回。来看一看下面的函数。

function callSomeFunction(someFunction,someArgumnt){
  return someFunction(someArgument);
}

  这个函数接受两个参数。第一个参数应该是一个函数,第二个参数应该是要传递给该函数的一个值。然后,就可以像下面的例子一样传递函数了。

function add10(num){
  return num+10 ;
}

var result=callSomefunction(add10,10);
alert(result);//20

function getGreeting(name){
  return "Hello,"+name;
}

var result2=callSomefunction(getGreeting,"Nicholas");
alert(result2);//Hello,Nicholas

  这里的callSomeFunction()函数是通用的,即无论第一个参数中传递进来的是什么函数,它都会返回执行第一个参数后的结果。因此,上面例子中传递给callSomeFunction()的是add10和getGreeting,而不是执行它们之后的结果。

  当然,可以从一个函数中返回另一个函数,而且这也是极为有用的一种技术。例如,假设有一个对象数组,我们想要根据某个对象属性对数组进行排序。而传递给数组sort()方法比较函数要接收两个参数,即要比较的值。可是,我们需要一种方式来指明按照哪个属性来排序。要解决这个问题,可以定义一个函数,它接收一个属性名,然后根据这个属性名来创建一个比较函数,下面就是这个函数的定义。

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;
    }
  };
}

  这个函数定义看起来有点复杂,但实际上无非就是在一个函数中嵌套了另一个函数,而且内部函数前面加了一个return操作符。在内部函数接收到propertyName参数后,它会使用方括号表示发来取得给定属性的值。取得了想要的属性值之后,定义比较函数就非常简单了。上面这个函数可以像下面例子中这样使用。

  var data=[{name:"Zachary",age:28},{name:"Nicholas",age:29}];

  data.sort(createComparisonFunction("name"));

  alert(data[0],name);//Nicholas;

  data.sort(createComparisonFunction("age"));

  alert(data[0],name);//Zachary

  这里,我们创建了一个包含两个对象的数组data,其中,每个对象都包含一个name属性和一个age属性。在默认情况下,sort()方法会调用每个对象的toString()方法以确定它们的次序;但得到的结果往往并不符合人类的思维习惯,因此,我们调用CreateComparisonFunction("name")方法创建了一个比较函数,以便按照每个对象的name属性进行排序。而结果排在前面的第一项是name为“Nicholas”,age是29的对象。然后,我们又使用了creatComparisonFunction("age")返回的比较函数,这次按照对象的age属性排序。等到的结果是name值为“Zachary”,age值是28的对象排在了第一位。

时间: 2024-10-11 12:59:33

Function类型-作为值的函数的相关文章

String类型,Function类型

1.String类型:  1)创建String对象:    var str=new String(s);    String(s);    参数:参数 s 是要存储在 String 对象中的值或转换成原始字符串的值.    返回值:当String()和运算符new一起作为构造函数使用时,它返回一个新创建的String对象,存放的是字符串s          当不用 new 运算符调用String()时,它只把 s 转换成原始的字符串,并返回转换后的值. 2)String对象属性:    leng

Function类型以及函数表达式

每个函数都是Function 类型的实例 要访问函数的指针而不执行函数的话,必须去掉函数名后面的那对圆括号. 在函数内部,有两个特殊的对象:arguments 和this.其中arguments除了保存参数数组之外,还有名为callee的属性,该属性是一个指针,指向拥有这个arguments 对象的函数.this引用的是函数据以执行的环境对象. ECMAScript 5 也规范化了另一个函数对象的属性:caller.这个属性中保存着调用当前函数的函数的引用,如果是在全局作用域中调用当前函数,它的

每个函数都是function类型的实例

每个函数其实都是function类型的.也就是说我们声明的函数都是对象,有自己的属性和方法,函数名不过是指向该对象的一个指针而已. 1 function myfun(arg){ 2 alert(arg); 3 } 4 5 var anfunc=myfuc; 6 7 myfuc=null; 89 anful(1);//报错还是弹出 结果是弹出1,myfuc不过是指向我们函数对象的一个指针而已,他指向null之后,并不影响anfuc的,因此调用没有影响.

c++函数参数类型-值,指针,引用

    以" 值传递"方式向函数传递参数 在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数.这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身. 例如: void changeValue(int originalValue,int newValue){     originalValue = newValue;   }      int main(){     int myNum=20;     changeV

Swift2.0语言教程之函数的返回值与函数类型

Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有一个返回值的函数 开发者希望在函数中返回某一数据类型的值,必须要在函数声明定义时为函数设定一个返回的数据类型,并使用return语句进行返回.其中,return语句的一般表示形式如下: return 表达式 其中,表达式可以是符合Swift标准的任意表达式.而具有返回值的函数声明定义形式如下: fu

python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): return x**2 y=func(10) print(y) def foo(): return None res=foo() print(res) def foo(): return{'a':1} res=foo() print(res['a']) def foo(): return {'a':1},1,'a',[1,2] res=foo() p

shell编程值之函数和select的使用

select   select循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3提示符,等待用户的输入,用户输入菜单列表中的某个数字,执行相应的命令,用户输入被保存在变量REPLY中. select是个无限循环,因此要记住用break命令退出循环,或者用exit直接退出脚本,也可以使用ctrl+c退出循环 select语句结构: select 变量 in 选项1 选项2 ;do break done #!/bin/sh PS3="what is you favourit

Function类型(JS高程3)—— JS学习笔记2015-6-29(第70天)

Function 类型 函数是对象 具有属性和方法,函数名实际上是一个指向函数对象的指针 没有重载: 函数声明和函数表达式 函数声明: function sum (num1, num2){ return num1 + num2; } 函数表达式: var sum = function(num1, num2){ return num1 + num2; };       //  这里是有分号的 二者基本上没有太大的区别,值得注意的是,函数表达式后面是有分号的: 还有一点就是,函数声明之前是可以调用函

【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型

前文提要:[js实例]js中的5种基本数据类型和9种操作符 Array类型的9个数组方法 Array中有9个数组方法: 1.检测数组 2.转换方法 3.栈方法 4.队列方法 5.冲排序方法6.操作方法 7.位置方法 8.迭代方法 9.归并方法 在实例中介绍,实例如下 /* Array类型 js数组中的每一项可以用来保存任何类型的数据:js数组的大小是可以动态调整的 */ var colors = ["red", "blue", "green"];