Функции JavaScript, возвращают неопределенный

1

Привет всем Надеюсь, что вы все отлично себя чувствуете,

это мой код, функция с именем и обратным вызовом, использующая имя для функции обратного вызова, чтобы вернуть имя и console.log it

Если я

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.

Так почему возвращение не работает?

Спасибо

  • 0
    Это как говорится. doSomething ничего не возвращает ни в одном из кодов (но если вы console.log переменную n переменная n находится в области видимости, она будет return doSomething() журнал) Вы хотели return doSomething() ?
  • 1
    return callback(name);
Показать ещё 2 комментария
Теги:

4 ответа

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 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, которые представляют собой очень улучшенные подходы, основанные на идее "перезвонить, когда есть что-то, что можно перезвонить" ".

  • 0
    Я все еще могу порекомендовать взглянуть на современный способ написания асинхронного кода в JS - даже если у вашего кода «нет причин быть асинхронным», JS выполняется в одном потоке, и все, что занимает много времени, блокирует поток, включая любые обработчики событий. Таким образом, вы, как правило, всегда хотите написать асинхронный код, чтобы убедиться, что в вашем коде есть множество точек, где планировщик задач может кратко передать управление другими вещами, которые также должны быть запущены.
  • 0
    Хорошо, я просто хочу использовать XMLHttpRequest с функцией вызова, функция вызова будет иметь responseText
Показать ещё 4 комментария
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. Но его не возвращают. Проще говоря, то, что вы в основном делаете, это

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

Если вы вызовете вышеуказанный метод, он вернется не определен. Чтобы вернуть правильное значение, вы должны вызвать "return returnValue". Similary вы должны сказать обратный вызов (имя)

Надеюсь это поможет.

Счастливое обучение

0

undefined неявно возвращается, если у вас нет возврата в вашей функции.

когда вы вызываете var val = doSomething("TEST",foo), вы выравниваете возвращаемое значение doSomething to val, которое не определено.

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

function foo(n) {
  return n;
}

var val = doSomething("TEST",foo);
console.log(val);
0

Inorder для назначения возвращаемого значения/объекта функции (в этом случае doSomething должен иметь оператор return. Else функция ничего не возвращает, поэтому, когда вы назначаете это val, она по-прежнему undefined.

Поэтому вы изменяете свой код следующим образом:

function doSomething(name,callback) {
    return callback(name);
}
function foo(n) {
    return n;
}
var val = doSomething("TEST",foo);
console.log(val);
  • 0
    Спасибо тебе ..: d ..

Ещё вопросы

Сообщество Overcoder
Наверх
Меню