Javascript学习篇:引用类型——Function类型(2)

 - 函数声明与函数表达式

解析器在向执行环境中加载数据时,会率先读取函数声明,保证在执行任何代码之前可以访问;至于函数表达式,必须等到解析器执行到它所在的代码行,才会真正被执行。

例  alert (sum(10,10));

function   sum   (num1,num2){

return    num1+num2;

}

在代码开始执行前,解析器就已经通过一个名为函数声明提升的过程,读取并将函数声明添加到执行环境中。即使声明函数的代码在调用它的代码后面,javascript引擎也能把函数声明提升到顶部。

例          alert (sum(10,10));

var   sum  =  function (num1,num2){

return num1+num2;

};

如果把函数声明改为等价的函数表达式,就会在运行期间产生错误,原因在于函数位于一个初始语句话中,而不是一个函数声明;换句话说,在执行到函数所在的语句之前,变量sum中不会保存有对函数的引起。

除了什么时候可以通过变量访问函数这一点区别之外,函数声明与函数表达式的语法其实是等价的。

  -         作为值的函数

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

例   function    callSomeFunction(someFunction,someArgument){

return     someFunction(someArgument);

}

这个函数接收两个参数:第一个参数是函数,第二个参数是传递给第一个函数的参数。

例              function    add(num){

return   num+10;

}

var    result1 = callSomeFunction(add,10);

alert(result1);     // 20

function getGreeting(name){

return "hello"+name;

}

var result2 =  callSomeFunction(getGreeting,"Nicholas");

alert(result2);         // "hello Nicholas"

这里的callSomeFunction()函数是通用的,无论第一个参数中传递进来的是什么函数,它都会返回执行第一个参数后的结果。要访问函数的指针而不执行函数的话,必须去掉函数名后面的()。因此传递给callSomeFunction()的是add和getGreeting,而不是执行他们之后的结果。

我们可以从一个函数中返回另一个函数。例如,有一个对象组。我想要根据某个对象属性对于数组进行排序。而传递给数组sort()方法的比较函数要接受两个参数,即比较的值。但是,我们需要一种方式来指明按照哪个属性来排序,因此可以定义一个函数,它接受一个属性名,然后用属性名来创建一个比较函数。

例     function  GreateComparisonFunction(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:"Zachary",age:28},{name:"Nicholas",age:29}];

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

alert(data[0].name);           // Nichilas

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

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

我们调用createComparisonFunction("name")方法创建了一个比较函数,以便按照每个对象的name属性值进行排序。然后,我们又使用了creatComparisonFunction(“age”)返回的比较函数,按照对象的age属性排序。

陈健的个人博客,记录生活所见所感、学习笔记。专注于Web前端_SEO教程_读书心得。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

返回主页看更多
狠狠的抽打博主 支付宝 扫一扫