当您只可以在Javascript中全局调用函数时,为什么还要使用回调?

时间:2018-07-17 15:42:31

标签: javascript asynchronous callback

我敢肯定有一个话题,但是对于我一生来说,我找不到它。我知道这是一个经典问题,如果这个问题是重复性的,那么我感到抱歉,但是我所阅读的文章/主题中没有一个解决我这个看似很明显的问题。

考虑此示例

function serverRequest(query, callback){
  setTimeout(function(){
    var response = query + "full!";
    callback(response);
  },5000);
}

function getResults(results){
  console.log("Response from the server: " + results);
}

serverRequest("The glass is half ", getResults);

此代码段完全按照其应有的方式工作。但是,作为对回调概念不熟悉的人,为什么我们可以跳过{并以正常方式调用它时,将getResults作为参数传递?

function serverRequest(query){
  setTimeout(function(){
    var response = query + "full!";
    getResults(response);
  },5000);
}

function getResults(results){
  console.log("Response from the server: " + results);
}

serverRequest("The glass is half ");

根据我的测试,第二个片段非常完美,不需要传递函数作为回调。我到底在这里想念什么?

3 个答案:

答案 0 :(得分:3)

出于与向setTimeout传递函数相同的原因。

因此,您可以重用serverRequest的逻辑,而无需对其产生的数据进行硬编码。

答案 1 :(得分:2)

答案简短?除非您拥有10000个函数,否则全局范围内的函数都可以使用。

通常,您根本不想在全局范围内放置任何内容,以避免命名冲突等。因此,通常不考虑全局范围。

回调并不好,所有很酷的孩子都使用Promises。

function serverRequest(query) {
    return new Promise(function (resolve) {
        setTimeout(function(){
            var response = query + "full!";
            resolve(response);
        },5000);
    });
}

serverRequest("The glass is half ").then(function (results) {
    console.log("Response from the server: " + results);
});

答案 2 :(得分:1)

因为第一个示例使其可重用,所以如果要切换getResults的行为并改为调用其他函数。