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

Javascript why can one specify callback without parameters?

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

这个回调 return 我的用户对象究竟是怎样的,因为我没有在 callback(user) 中指定 return 函数,也没有为我的回调指定任何函数体.这是在 setTimeout(()...) 函数内部完成的,因为 timeoutHandler 实现隐含地 returning 某些东西吗?

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

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


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

函数即回调在此处作为参考传递。所以你可以随心所欲地传递它,当你调用它时你可以传递参数并且它会引用原始函数。

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

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

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

};

我在这里看到两个问题:

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

因为函数是 first-class 对象,我们可以将一个函数作为参数传递给另一个函数,然后执行传入的函数,甚至 return 它稍后执行。

在此处阅读更多内容:https://javascriptissexy.com/understand-javascript-callback-functions-and-use-them/

下面显示函数也只是对象:

function hello() {
  return 'hello';
}

hello.other = 'world';

console.log(hello() + ', ' + hello.other);
  • 这个回调 return 我的用户对象到底是怎么回事,因为我没有在 callback(user) 中指定 return 函数,也没有指定任何函数体一切为了我的回电。

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

如果未指定,函数具有隐式 returns,即 returns undefined,这意味着您没有显式 return.

示例如下:

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

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

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

console.log(hi()); // Hi, World.
  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);
});