Как функция может принять необъявленную переменную в качестве параметра? - PullRequest
0 голосов
/ 10 октября 2018

Я работаю над набором задач перед загрузкой.Следующая проблема требует, чтобы мы кодировали ответ в зависимости от того, сколько раз посетитель посетил ресторан.Объект содержит имена клиентов и количество посещений.В функцию передан параметр customerName, однако customerName не объявлено.Меня смущает, почему объект 'customerData' не был передан функции, вместо этого передаются фактические ключи 'имена клиентов'.Код следует:

/*Write a function called "greetCustomer".
*
*Given a name, "greetCustomer" returns a greeting based on how many times that
*customer has visited the restaurant.  Please refer to the customerData object. 
*/

var customerData = {
  'Joe': {visits: 1 },
  'Carol': {visits: 2 },
  'Howard': {visits: 3, },
  'Carrie': {visits: 4 }
};

var greetCustomer = function(customerName) {
  for (var customer in customerData) {
    if (customer === customerName) {
        return 'Hello '+ customer + ', welcome back for visit #' + (customerData[customer].visits + 1) + '!';
    }
  }
  return undefined;
};

greetCustomer('Carrie');

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Менее подробное объяснение будет:

Каждый раз, когда вы вызываете функцию, ее параметры содержат значение, которое вы передали или иным образом неопределенное

Другая проблема - это вопрос области видимости ... когда выобъявите customerData с помощью var, и все, что находится внутри ближайшей включающей функции (или глобальной области видимости), может ссылаться на нее. Полезно знать, как управлять областью действия:

var // nearest enclosing function
let // nearest enclosing block

(нет) // родительская область действия

Надеюсь, это помогло

0 голосов
/ 10 октября 2018

customerName является заполнителем и в данном примере 'Carrie'.Значение передается при вызове функции greetCustomer.Другими словами, вся функция var greetCustomer, когда она определена, сохраняется в памяти - и эта функция знает, что ей может быть передан параметр customerName. Исходя из того, где вы ее запускаете, вы даже можете создать консоль.log (greetCustomer), чтобы увидеть фактическую функцию и способ ее сохранения.

Чтобы объяснить все происходящее:

  1. Объект customerData сохраняется в памяти и будет переданссылка.
  2. Функция greetCustomer сохраняется в памяти.Функции также являются объектами в JavaScript, поэтому они передаются по ссылке.
  3. Функция greetCustomer вызывается и передается значение 'Carrie'.
  4. Значение 'Carrie' передается в greetCustomer.функция сохраняется в памяти, где она затем циклически перебирает каждую клавишу в объекте customerData, используя цикл for..in.
  5. Если этот ключ (имя) равен переданному значению для customerName, то функция возвращает приветствие.
  6. Если ключ (имя) не найден в объекте customerData, не возвращать приветствие,то есть undefined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...