如何用简单的英语解释回调?它们与从一个函数调用另一个函数从调用函数获取上下文有什么不同?如何向新手程序员解释它们的强大功能?
当前回答
回调函数:
我们定义了一个名为callback的回调函数,给它一个参数otherFunction,并在函数体中调用它。
function callback(otherFunction){
otherFunction();
}
当我们调用回调函数时,它需要一个类型为函数的参数,因此我们使用匿名函数调用它。但是,如果实参不是function类型,则会产生错误。
callback(function(){console.log('SUCCESS!')});
callback(1); // error
烤披萨的例子。 烤炉 披萨底,上面有配料 这里,烤箱是回调函数。 披萨的配料是另一个功能。
值得注意的是,不同的披萨原料可以做出不同类型的披萨,但烘焙披萨的烤箱是一样的。 这在某种程度上是回调函数的工作,它不断期望具有不同功能的函数,以产生不同的自定义结果。
其他回答
回调允许您将自己的代码插入到另一个代码块中,以便在另一个时间执行,从而修改或添加其他代码块的行为以满足您的需要。您获得了灵活性和可定制性,同时能够拥有更可维护的代码。
更少的硬代码=更容易维护和更改=更少的时间=更多的业务价值=很棒。
例如,在javascript中,使用Underscore.js,你可以在这样的数组中找到所有偶数元素:
var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
=> [2, 4, 6]
示例由Underscore.js提供:http://documentcloud.github.com/underscore/#filter
简单明了:回调是你给另一个函数的函数,这样它就可以调用它。
通常在某个操作完成时调用它。由于在将回调函数交给其他函数之前创建了回调,因此可以使用调用站点的上下文信息初始化它。这就是为什么它被命名为call*back* -第一个函数从它被调用的地方回调到上下文。
回调函数是作为参数传递给另一个函数的函数(在某些时候使用)。
以下是一些函数:
def greeting(name):
print("Hello " + name + "!")
def departing(name):
print("Goodbye " + name + "!")
下面是一个函数(使用ourCallBack作为回调参数):
def promptForName(ourCallback):
myName = input("Enter Name:")
ourCallback(myName)
现在让我们使用一些回调!
promptForName(greeting)
# Enter Name:
# >Ed
# Hello Ed!
promptForName(departing)
# Enter Name:
# >Ed
# Goodbye Ed!
promptForName(greeting)
# Enter Name:
# >Guy
# Hello Guy!
我能够很快地扩展我的代码。
处理(错误和误导性的)答案:
回调并不意味着异步!
JS在2015年得到承诺,async/await在2017年得到承诺。在此之前,使用回调。
这就是为什么这里的一些答案没有意义,他们把两者混为一谈了!
它们通常用于异步代码,但我的示例是同步的。
回调并不意味着事件驱动!
它们通常用于事件处理,但我的示例不是事件。
回调并不意味着闭包!
虽然通常用作提供闭包的一种简洁方式,但我的示例并不是这样。
回调不是第一类函数的完整定义!
它是创建第一类函数定义的众多特性之一。
C语言可以使用函数指针作为回调函数,尽管它没有第一类函数。
你觉得不舒服,所以去看医生。他检查了你的身体,认为你需要一些药物治疗。他开了一些药,并把处方打电话到你当地的药店。你回家吧。稍后,你的药房打电话告诉你,你的处方已经准备好了。你去捡吧。
这是关于下载网页的:
Your program runs on a cellphone and is requesting the webpage http://www.google.com. If you write your program synchronously, the function you write to download the data will be running continuously until all the data is download. This means your UI will not refresh and will basically appear frozen. If you write your program using callbacks, you request the data and say "execute this function when you've finished." This allows the UI to still allow user interaction while the file is downloading. Once the webpage has finished downloading, your result function (callback) is called and you can handle the data.
基本上,它允许你请求一些东西,并在等待结果的同时继续执行。一旦结果通过回调函数返回给您,您就可以从它停止的地方开始操作。