function createComparisonFunction(propertyName)
{
return function(object1,object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if(value1value2)
{
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
函数内部属性
在函数内部,有两个特殊的对象:arguments和this。arguments是一个类数组对象,包含着传入函数中的所有参数。该对象还有个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。如下非常经典的阶乘函数:
function factorial(num)
{
if(num<=1)
{
return 1;
}else{
return num*factorial(num-1);
}
}
定义阶乘一般要用到递归算法,如上所示。在函数有名字并且不改变的情况下,这样定义没有问题。但这样就将函数的执行与函数名factorial紧紧的联系到了一起,为了消除这种紧密的耦合现象,可以采用arguments.callee。
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
函数内部的另一个特殊对象就是this.this引用的是函数据以执行的环境对象,当在网页的全局作用域中调用函数时,this对象引用的是window。如下所示:
window.color = "red";
var o = {color:"blue"};
function printColor(){
alert(this.color);
}
printColor;//red
o.printColor = printColor;
o.printColor();//blue
以上函数中sayColor()是在全局作用域中定义的,引用了this对象,由于在调用之前并不确定this的值,因此this可能会在执行过程中引用不同的对象,当在全局中被调用时,this引用的是全局对象window,即this.color 会转换成window.color,于是返回“red”;当把这个函数赋给对象o并调用o.printColor()时,this引用的是对象o,因此对his.color求值会转换成对o.color求值,结果就返回“blue”。
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
prototype属性非常重要,以后详讲。
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
严格模式下,未指定环境变量而调用函数,则this值不会转型为window,除非明确把函数添加到某个对象或者调用apply()或者call(),否则this 值将是undefined。
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