Javascript为什么可以指定不带参数的回调?

时间:2018-10-23 11:34:22

标签: javascript callback handler

我最初来自Java编程语言,我只是想知道为什么在javascript中可以将回调函数作为变量或纯对象(不带参数)传递给另一个函数,然后在内部使用此回调函数另一个功能,但这一次要传递参数。

该回调函数如何返回我的用户对象,因为我没有在callback(user)中指定返回函数,也没有为回调函数指定任何函数体。这是在setTimeout(()...)函数内部完成的,因为timeoutHandler实现隐式返回了什么吗?

var getUser = (id,callback) => {
    var user = {
        id: id,
        name: 'Vikram'
    };

    setTimeout(() => {
        callback(user);
    },3000);    
};


getUser(31, (userObject) => {
    console.log(userObject);
});

3 个答案:

答案 0 :(得分:1)

我在这里看到两个问题:

  • 为什么在javascript中可以将回调函数作为变量或纯对象(不带参数)传递给另一个函数。

由于函数是一类对象,我们可以将一个函数作为参数传递给另一个函数,然后再执行该传入的函数,甚至将其返回以供以后执行。

在此处了解更多信息:https://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/

下面显示的功能也只是对象:

function hello() {
  return 'hello';
}

hello.other = 'world';

console.log(hello() + ', ' + hello.other);
  • 此回调如何返回我的用户对象,因为我没有在callback(user)中指定返回函数,也没有为回调指定任何函数体。

setTimeout(()...)函数不会隐式返回任何东西,它只是注册一个函数,稍后再执行。当setTimeout注册的函数触发时,它将调用callback(user)并解析getUser注册的函数,该函数登录到控制台。记住回调是异步的。

如果未指定,则函数具有隐式返回,该返回将返回undefined,这意味着您没有显式返回。

下面显示了一个示例:

function hello() {
  console.log('Hello, World');
}

console.log(hello()); // undefined.

function hi() {
  return 'Hi, World';
}

console.log(hi()); // Hi, World.

答案 1 :(得分:0)

函数即回调函数在此处作为参考传递。因此,您可以随意传递它,当您调用它时,可以传递参数,它将引用原始函数。

它也不返回用户对象,只是安慰用户对象。由于您没有使用任何返回,它将返回未定义。尝试安慰fn返回的回调。

var getUser = (id,callback) => {
var user = {
    id: id,
    name: 'Vikram'
};

setTimeout(() => {
    console.log(callback(user), 'return value of callback');
},3000);    

};

答案 2 :(得分:0)

  1. 在javascript函数中是一个对象。 它的行为仅与()相同 因此,您可以将函数作为值传递给另一个函数或变量。

  2. javascript中的某些函数是异步的。 setTimeout是这样的异步功能。这意味着回调函数将在一段时间后运行。

发生了什么事

//assign anonymous function to variable
// until function without () it only a object
var getUser = (id,callback) => {
    //set up params
    var user = {
        id: id,
        name: 'Vikram'
    };

    // setup asynchronous function setTimeout
    setTimeout(() => {
        // run callback with params when time would done
        callback(user);
    },3000);
};

// call function which contains in getUser-variable and pass 2 params: int and callback-function
getUser(31, (userObject) => {
    console.log(userObject);
});