Почему callback функцию нельзя сравнить с null?

196
18 декабря 2017, 15:45
        let loop = function(times = 0, callback = null) {
        for (let i = 1; i <= times; i++) {
            // if (callback == null) {
            //     clear();
            // }
            callback(i);
            console.log(i);
        }
    }
    function show(par) {
        console.log('massage ' + par);
    }
    function clear(par) {
        // console.log('...' + par);
    }
    loop(3, show);
    // loop(3);

Почему нельзя сравнивать callback с null? Отладчик ругается:

Uncaught TypeError: callback is not a function

когда не передаю второй аргумент (то есть callback == null).

Answer 1

Потому что вы пытаетесь вызвать callback(i); в той ситуации, когда у вас callback = null. Вот он и пишет что это не функция.

Я не знаю что вы хотите получить, но в таких ситуациях обычно делается проверка на null перед вызовом. И вызов делается только на не null функцию.

Answer 2

Сравнить можно. Только вызывать/не вызывать ее надо в зависимости от результата сравнения.

if (callback == null) {
  ...
} else { // !!!
  callback(i);
}

или

if (callback != null) {
  callback(i);
}

или

let loop = function(times = 0, callback = null) {
   if (callback == null)
       return;
   for (let i = 1; i <= times; i++) {
       // ...
   }
}
Answer 3

Тут проблема не в проверке на null, а в том, что если callback равен null, то цикл не заканчивается и продолжает отрабатывать дальше, то есть пытаются выполниться строки

callback(i);
console.log(i);

что конечно же невозможно. Вот и ругается, что callback не является функцией.

В итоге, нужно, если callback == null либо делать break;, либо continue;, в зависимости от логики

либо if {} else {}

READ ALSO
Вылетает callback error node.js

Вылетает callback error node.js

есть файл serverjs

252
Подгрузка JSON при клике по ссылке

Подгрузка JSON при клике по ссылке

Здравствуйте! Нужно, чтобы при нажатии на ссылку подгружался файл JSONПри проверке через консоль без события Click все работает:

240
Самопроизвольное изменение интервала смены слайдов в слайдере на js с применением JQuery

Самопроизвольное изменение интервала смены слайдов в слайдере на js с применением JQuery

Ошибка, которую сложно отловитьЕсли оставить вкладку с данным слайдером открытой, заниматься своими делами в браузере, а затем вернуться,...

366
передача данных с формы в pivot таблицу laravel

передача данных с формы в pivot таблицу laravel

Добрый день! Недавно начал изучать ларавел и возникла проблема (в интернете ничего подобного не нашел либо не правильно составлял запрос)...

276