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