在javascript的世界里,函数也是对象,函数名是指向对象的指针。一般有如下三种方法来声明一个函数:
第一种
function someFunction() {
alert("hello");
} //能够被代码解析器扫描到
第二种
var someFunction = function() {
alert("hello");
}; //不会被代码解析器扫描到
第三种
var someFunction = new Function("alert(\"hello\");"); //不推荐
这三种方式声明函数的效果基本上一样,第一种和第二种的区别在于,第一种代码解析器会在代码执行之前扫描函数时被扫描到,而第二种不会,第三种与第二种的方式一样,但是执行效率会比较低,因为会导致两次解析代码,第一次是普通的js代码,第二次是传到Function构造函数的字符串。
第一种和第二种的区别可以用以下例子说明:
alert(sum(10,10)); //可以正常执行
function sun(num1,num2) {
return num1 + num2;
}
alert(sum(10,10)); //不可以正常执行
var sum = function(num1,num2) {
return num1 + num2;
};
既然函数作为一个对象,就可以当做一个参数传递给另外一个函数,同时也可以当做另外一个函数的返回值。
/**
* callSomeFunction的作用是接收传递过来的函数名以及该函数所接收的参数
* 调用该函数,并返回该函数执行完成之后的返回值
* @param someFunction 某个函数的名字
* @param someArgument 摸个函数接收的参数列表
* @returns
*/
function callSomeFunction(someFunction , someArgument) {
return someFunction(someArgument);
}
function add10(num) {
return num + 10;
}
alert(callSomeFunction(add10,20)); //30
function getGreeting(name) {
return "hello " + name;
}
alert(callSomeFunction(getGreeting ,"Sean")); //hello Sean
上述代码显示了函数如何作为一个参数,下面的代码显示了函数如何被当做返回值的,
/**
* 该函数的作用是接收一个数组作为排序比较的属性作为参数
* 然后返回通过某种方法比较大小的函数
* @param comparedPropertyName 排序的依据
* @returns {Function}
*/
function createComparisonFunction(sortPropertyName) {
return function(object1,object2) {
var value1 = object1[sortPropertyName];
var value2 = object2[sortPropertyName];
if(value1 > value2) {
return 1;
} eles if(value1 < value2) {
return -1;
} else {
return 0;
}
};
}
var data = [{name : "abc",age : 28},{name : "def",age : 27}];
data.sort(createComparisonFunction("name"));
alert(data[0].name); //abc
data.sort(createComparisonFunction("age"));
alert(data[0].name); //def
在上面代码中,定义了一个data数组,现在需要对data排序,数组对象提供了sort方法来方便排序。使用sort方法需要提供一个方法来让sort知道如何去比较两个元素的大小,以此来决定如何排序。data数组的每个元素有两个属性,name和age,都可以作为比较大小的对象,以不同的属性作为比较大小的依据得到的结果是不一样的。所以就定义了一个名为createComparisonFunction的方法,该方法接收需要被作为比较依据属性的名字,返回比较的方法。