JavaScript函数,返回未定义的

JavaScript函数,返回未定义的,javascript,Javascript,大家好,希望大家都做得很好, 这是我的代码,带有名称和回调的函数 将名称传递给回调函数,使其返回名称并将其记录在console.log中 如果我 我没有定义 如果我 这很好,请输入console.log测试名称 那么,为什么回报不起作用呢 谢谢您的doSomething()函数没有返回任何内容,这意味着使用它的赋值将是未定义的。但是,这并不是真正的问题 潜在的问题是,这里似乎混合了两种不同的数据处理模式:如果您编写的是纯同步代码,那么就使用返回函数(它会立即返回一些值)。如果您需要异步代码,那么

大家好,希望大家都做得很好,

这是我的代码,带有名称和回调的函数 将名称传递给回调函数,使其返回名称并将其记录在console.log中

如果我

我没有定义

如果我

这很好,请输入console.log测试名称

那么,为什么回报不起作用呢

谢谢

您的
doSomething()
函数没有返回任何内容,这意味着使用它的赋值将是
未定义的
。但是,这并不是真正的问题

潜在的问题是,这里似乎混合了两种不同的数据处理模式:如果您编写的是纯同步代码,那么就使用返回函数(它会立即返回一些值)。如果您需要异步代码,那么使用回调(它将“最终”执行某些操作)。这两种模式的混合会带来问题和挫折:

要么:

  • 不要将函数命名为“回调”,并让它返回已处理的值,或者
  • 让回调负责执行您将要使用
    val
    执行的任何操作
  • 案例1:

    function doSomething(data, processor) {
      return processor(data);
    }
    
    function passThrough(v) { return v; }
    
    var val = doSomething("test", passThrough);
    // immediately use "val" here in for whatever thing you need to do.
    
    案例2:

    function doSomething(data, callback) {
      // _eventually_ a callback happens - for instance, this
      // function pulls some data from a database, which is one
      // of those inherently asynchronous tasks. Let's fake that
      // with a timeout for demonstration purposes:
      setTimemout(() => callback(data), 500);
    }
    
    function handleData(val) {
      // use "val" here in for whatever thing you need to do. Eventually.
    }
    
    doSomething("test", handleData);
    
    如果你想使用案例2,你真的想看看现代Javascript中的“承诺”和async/await,它们是基于“一旦有什么事情需要回拨”思想的高度改进的方法

    2021年编辑:第三个选择是使用这个模式,这是围绕承诺的语法糖

    案例3:

    async function doSomething(input) {
      // we're still _eventually_ returning something,
      // but we're now exploiting `async` to wrap a promise,
      // which lets us write normal-looking code, even if what
      // we're really doing is returning a Promise object,
      // with the "await" keyword auto-unpacking that for us.
      return someModernAsyncAPI.getThing(input);
    }
    
    function handleData(val) {
      // ...
    }
    
    async function run() {
      const data = await doSomething("test");
      handleData(data);
    }
    
    run();
    

    为了分配函数的返回值/对象(在本例中是
    doSomething
    ,它应该有一个return语句。否则函数什么也不返回,所以当您将其分配给
    val
    时,它仍然是
    未定义的

    因此,您可以这样修改代码:

    function doSomething(name,callback) {
        return callback(name);
    }
    function foo(n) {
        return n;
    }
    var val = doSomething("TEST",foo);
    console.log(val);
    

    如果函数中没有返回,则隐式返回未定义的

    当您调用
    var val=doSomething(“TEST”,foo)
    时,您将doSomething的返回值与未定义的val对齐

    function doSomething(name,callback) {
      return callback(name);
    }
    
    function foo(n) {
      return n;
    }
    
    var val = doSomething("TEST",foo);
    console.log(val);
    
    看看上面的代码。当您调用doSomething时,它在内部执行foo,它会在控制台上打印,因为console.log就是用于此目的的。但是,在这个语句之后,它也会返回n,然后在doSomething中接收到n。但它不会被返回。简单地说,您主要做的是

    function doSomething(name,callback) {
        const returnValue = callback(name);
    }
    
    如果调用上述方法,它将返回undefined。要使其返回正确的值,您必须调用“returnValue”。类似地,您必须说 返回回调(名称)

    希望这有帮助


    快乐学习

    正如它所说。
    doSomething
    在两种代码中都不会返回任何内容(但是如果您
    console.log
    n
    变量处于作用域时,将记录
    n
    变量),您的意思是
    返回doSomething()
    返回回调(名称);
    我希望foo函数返回n;是的,让foo返回n并进行doSometing
    返回回调(name)
    我仍然建议您看看现代JS编写异步代码的方式——即使您的代码“没有异步的理由”,JS在单个线程中运行,任何耗时较长的操作都会阻塞该线程,包括任何事件处理程序,因此您通常希望编写异步代码,以确保代码中有足够多的点,任务调度器可以在这些点上短暂地控制其他也需要运行的操作。好的,我只想使用XMLHttpRequests如果使用call函数,call函数将具有responseText,您可能不想使用它,因为这是一种非常旧的机制,需要非常过时的JS方法。您希望使用现代的Fetch API,这是一种非常明确的异步、现代的JS方式来获取远程内容。请看,我刚刚做了最喜欢的产品,如果用户单击fav的图像,调用xmlhttprequest并将其插入数据库,
    function doSomething(name,callback) {
      return callback(name);
    }
    
    function foo(n) {
      return n;
    }
    
    var val = doSomething("TEST",foo);
    console.log(val);
    
    function doSomething(name,callback) {
    callback(name);
    }
    
    function foo(n) {
       console.log(n);
       return n;
    }
    
    var val = doSomething("TEST",foo);
    
    function doSomething(name,callback) {
        const returnValue = callback(name);
    }