Передача функции в другие функции в качестве параметров - PullRequest
0 голосов
/ 01 ноября 2018

Я недавно начал изучать программирование и JS, HTML, CSS. Читая книгу в данный момент, которая включает следующий фрагмент кода, который я пытаюсь понять и изменить для своей собственной практики и попыток понять. Но я действительно не могу понять, что происходит. Есть ли кто-нибудь, кто мог бы попытаться объяснить, что происходит и почему мой измененный фрагмент кода не будет работать - так как он выглядит похожим на часть оригинального, который работает нормально. Первый прикрепленный фрагмент является оригинальным из книги. Второй - мой, который построен на частях предыдущего.

var validateDataForAge = function(data) {
  person = data();
  console.log(person);
  if (person.age <1 || person.age > 99){
      return true;
  } else{
      return false;
  }
};

var errorHandlerForAge = function(error) {
  console.log("Error while processing age");
};

function parseRequest(data,validateData,errorHandler) {
  var error = validateData(data);
  if (!error) {
  console.log("no errors");
  } else {
  errorHandler();
  }
}

var generateDataForScientist = function() {
  return {
    name: "Albert Einstein",
    age : Math.floor(Math.random() * (100 - 1)) + 1,
  };
};

//parse request
parseRequest(generateDataForScientist, validateDataForAge,
errorHandlerForAge);

var validateAge = function(age) {
  person = age();
  console.log(age);

}

validateAge(17);

Я получаю следующее сообщение об ошибке:

TypeError: age не является функцией at validateAge: 2: 12 на eval: 7: 1 в Eval на новое обещание

благодарен за любую помощь.

С уважением,

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Проблема здесь, в этой части вашего кода

var generateDataForScientist = function() {
  return {
    name: "Albert Einstein",
    age : Math.floor(Math.random() * (100 - 1)) + 1, // <- problem
  };
};

age - это просто свойство возвращаемого вами объекта, и вы используете в этом коде age как функцию

var validateAge = function(age) {
  person = age(); // <-- here ,age is not a function
  console.log(age);

}

вам нужно изменить свойство age, чтобы эта функция была такой

var generateDataForScientist = function() {
  return {
    name: "Albert Einstein",
    age : function (){ return Math.floor(Math.random() * (100 - 1)) + 1 },
  };
};
0 голосов
/ 01 ноября 2018

утешительный data внутри parseRequest будет регистрировать его как функцию. Но вам нужна собственность age. Поэтому замените validateData(data) на validateData(data());

var validateDataForAge = function(data) {
  let person = data;
  if (person.age < 1 || person.age > 99) {
    return true;
  } else {
    return false;
  }
};

var errorHandlerForAge = function(error) {
  console.log("Error while processing age");
};

function parseRequest(data, validateData, errorHandler) {
  console.log(data)
  var error = validateData(data());
  if (!error) {
    console.log(error);
  } else {
    errorHandler();
  }
}

var generateDataForScientist = function() {
  return {
    name: "Albert Einstein",
    age: Math.floor(Math.random() * (100 - 1)) + 1,
  };
};

//parse request
parseRequest(generateDataForScientist, validateDataForAge, errorHandlerForAge);
0 голосов
/ 01 ноября 2018

Вот код, который вы смотрите. Ожидается, что data будет функцией.

var validateDataForAge = function(data) {
  person = data();

… и так оно и есть (тот, который назначен на generateDataForScientist после того, как он прошел через пару других переменных и вызовов функций).


Вот ваш код:

var validateAge = function(age) {
  person = age();

Ожидается, что age будет функцией.

Здесь вы передаете ему значение:

validateAge(17);

17 - это число, а не функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...