JavaScript函数,返回未定义

时间:2018-07-30 22:22:32

标签: javascript

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

这是我的代码,具有名称和回调的功能 以名称为回调函数以返回名称并用console.log记录

如果我

function doSomething(name,callback) {
    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);
}

var val = doSomething("TEST",foo);

正常运行,并在console.log中输入TEST名称。

那为什么退货不起作用?

谢谢

4 个答案:

答案 0 :(得分:2)

您的doSomething()函数不返回任何内容,这意味着使用该函数的赋值为undefined。但是,这实际上并不是问题所在。

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

要么:

  1. 不要将您的函数命名为“回调”,而让其返回其处理后的值,或者
  2. 让回调函数负责使用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中的“ Promises”和async / await,它们是基于“一旦有什么事情要回呼就回叫”的思想的高度改进的方法。回拨一下。”

答案 1 :(得分:0)

为了分配函数的返回值/对象(在本例中为doSomething,它应该有一个return语句。否则该函数不返回任何内容,因此当您将其分配给val时,它将仍然是undefined

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

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

答案 2 :(得分:0)

如果您的函数没有返回值,则会隐式返回

undefined

调用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);

答案 3 :(得分:0)

function doSomething(name,callback) {
callback(name);
}

function foo(n) {
   console.log(n);
   return n;
}

var val = doSomething("TEST",foo);

看看上面的代码。当您调用doSomething(在内部执行foo)时,它将在控制台上打印,因为那就是console.log的用途。但是,在此语句之后,它也返回n,然后在doSomething中接收到该n。但是它没有被退还。简而言之,您主要要做的是

function doSomething(name,callback) {
    const returnValue = callback(name);
}

如果调用上述方法,它将返回未定义。要使其返回正确的值,您必须调用“ return returnValue” 。类似,你必须说 返回回调(名称)

希望这会有所帮助。

学习愉快