翻译:http://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/
还没有翻译完
函数也是一种对象
在JS中,函数就是一种对象。它有对象应该有的所有操作:
- 存在变量名中
- 当作参数传到另一个函数中
- 在函数中被创建
- 在函数中被返回
所以,我们可以把函数当作变量传到另一个函数里,传进去之后执行甚至返回等待之后的执行。这就是callback函数的本质。
callback函数
callback函数的概念起源于函数式编程。在本质上,函数式编程定义了把函数用做参数。直到现在,大多数人还是认为函数式编程只是高级程序员才会用的。
callback函数是函数式编程中的一个主要概念。读完这篇文章你就懂了,并且发现实现callback函数就和把一个变量传入某个函数里一样简单。这个技术这么简单,以至于我没法理解它为什么出现在JS的高级教程里。
什么是callback函数或者high-order函数
callback函数就是被当作参数传入另一个函数的函数,并且传入之后在另一个函数中被执行。他们在jQuery和JS中随处可见。
//看!click函数中的参数不是普通的参数,而是一个函数!
//那个函数就是callback函数
$("#btn_1").click(function() {
alert("Btn 1 Clicked");
});
callback函数是怎么work的
当我们把一个callback函数当作采纳书传到另一个函数中,我们只是传入了函数的定义,而并没有执行这个函数。(因为我们当作参数传入函数的时候并没有在定义之后加上()符号,因为函数名后面加上括号才代表要执行它了)。
一个函数由于被传入了callback函数当作参数,他就可以随时执行这个传进来的callback函数。
callback函数其实是一个闭包,因此callback函数可以访问到包含它的函数的变量,甚至可以访问到全局变量。
实现callback函数的一些基本原则
使用不匿名函数还是匿名函数
一个匿名的callback函数的例子:
var friends = ["Mike", "Stacy", "Andy", "Rick"];
friends.forEach(function (eachName, index){
console.log(index + 1 + ". " + eachName); // 1. Mike, 2. Stacy, 3. Andy, 4. Rick
});
一个是不匿名的callback函数的例子:
// global variable
var allUserData = [];
// generic logStuff function that prints to console
function logStuff (userData) {
if ( typeof userData === "string")
{
console.log(userData);
}
else if ( typeof userData === "object")
{
for (var item in userData) {
console.log(item + ": " + userData[item]);
}
}
}
// A function that takes two parameters, the last one a callback function
function getInput (options, callback) {
allUserData.push (options);
callback (options);
}
// When we call the getInput function, we pass logStuff as a parameter.
// So logStuff will be the function that will called back (or executed) inside the getInput function
getInput ({name:"Rich", speciality:"JavaScript"}, logStuff);
// name: Rich
// speciality: JavaScript
也可以给callback函数传入参数
无论是外部函数的数据,还是全局的数据都可以当作参数传给callback