ü 定义
匿名函数的定义非常简单:就是没有名字的函数。但是其用途非常的大
ü 典型的函数定义方式
在看匿名函数之前我们先看下在Javascript中定义一个函数比较典型的几种方式
- 函数声明
function functionName(args) { //函数体 }
- 函数表达式
var functionName = function (args) {//函数体 }
函数声明与函数表达式的区别:
- 函数声明会在任何代码执行以前被加载到作用域
- 函数表达式则是在代码执行到那一行的时候才会有定义
例如:
那么在函数声明会给函数指定一个名字,而函数表达式则是创建一个匿名函数,原后将函数赋值一个变量,这个变量就指向了这个函数。
ü 匿名函数常用调用方式
定义一个匿名函数如下:
function(x, y, z) {return x + y + z; }
以上匿名函数没有名字,那么谁也不可能调用这个函数,因为没有指向这个函数的指针,我们可以像下面这样的方式调用匿名函数
- 直接调用
var result = function (x, y, z) {return x + y + z; }(1,2,3)
- 将函数赋值给变量(如上函数表达式方式)
在Javascript中允许有两种方式调用函数,第一种就是典型的函数调用:函数名(函数参数列表),另一种方式是将函数作为表达式:(用函数作为表达式)(参数列表)
比如上例中可以这样调用
1. (func1)() 2. ( function (x, y, z) { return x + y + z; })()
ü 匿名函数的常用法
例1:四则运算
/* 四则运算 */var fourOperations = function (fn, x, y) {return fn(x, y);}var add = function (x, y) {return x + y;}alert(fourOperations(add, 10, 20));alert(fourOperations(function (x, y) {return x * y;}, 10, 20));
例2:复杂对象数组的排序
在看复杂对象排序之前我们先来看下简单的数组排序
a.简单数组排序
/* 数组排序 */var person1 = ["cnblog", "abc", "def", "cx"];person1.sort();alert(person1);
在默认情况下,sort排序按升序排列数组项,排序过程中首先会调用项的toString()方法,原后比较得到的字符串。
b.复杂数组排序
/* 定义复杂对象 */function Person(name, age) {this.name = name;this.age = age;}Person.prototype.toString = function () {return "name: " + this.name + " age: " + this.age;}/* 初始化数组 */var person = [new Person("cnblog", 25),new Person("abc", 30), new Person("def", 26), new Person("cx", 31)];/* 直接使用匿名函数来进行排序 */person.sort(function (value1, value2) { return value1.name > value2.name ? 1 : -1; });alert(person);/* 改进排序方式 */person.sort(sortFunction("age"));alert(person);// function showSortResult(person) { // var result = "";// for (var i = 0, length = person.length; i < length; i++) { // result += ("name:" + person[i].name + " age:" + person[i].age + " ");// }// alert(result);// }function sortFunction(property) {return function (value1, value2) {return value1[property] > value2[property] ? 1 : -1;}}
对于复杂对象的操作在实际应用中是相当常见的,例如在对json对象进行排序时就可以使用上面的方法。
3.利用匿名函数构建“块级作用域”,这个留着在讲作用域时再细讲
当然匿名函数的作用很多,也欢迎大家分享自己的一些实战经验
注:第一篇技术文章,多支持