Javascript закрытие не показывает параметры должным образом - PullRequest
0 голосов
/ 22 апреля 2020

Я немного поиграл с замыканиями, чтобы выучить их, и сделал этот код:

function showName(a,b,c){
  (function nombresAnidados(a){
  (function(b){
    (function(c){
      console.log("hola " + a + " " + b + " " + c);
    })(a)
  })(b)
})(c)
}

showName("cat","dog","horse");

Я ожидал, что он напечатает: «Привет, собака-кошка», но вместо этого он напечатает: «Привет, лошадь, лошадь, лошадь»

Пожалуйста, запустите ее здесь:

    function showName(a,b,c){
      (function nombresAnidados(a){
      (function(b){
        (function(c){
          console.log("Hi, " + a + " " + b + " " + c);
        })(a)
      })(b)
    })(c)
    }
    
    showName("cat","dog","horse");

Что вызывает такое поведение?

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

В предыдущем ответе будет напечатано "лошадь - собака - кошка", но вы хотели "кошка - собака - лошадь".

Я думаю, вы хотите это:

function showName(a, b, c)
  {
  (function nombresAnidados(c)
    {
    (function (b)
      {
      (function (a)
        {
        console.log(  `hi : ${a} - ${b} - ${c}` );
        })(a) // a (cat)
      })(b)  // b (dog)
    })(c)   // c (horse)
  }

showName("cat", "dog", "horse");

Кроме того, это действительно замыкание, поскольку внутренние функции в цепочке имеют доступ к переменным внешних функций. Самая внутренняя функция может обращаться к переменным b и c из внешних функций, но вы не можете получить доступ к обеим этим переменным вне этой внутренней области действия функции.

1 голос
/ 22 апреля 2020

попробуй:

function showName(a, b, c)
  {
  (function nombresAnidados(x)  // here your arg a get the value of c
    {
    (function (y)
      {
      (function (z)
        {
        console.log(  `hi : ${x} - ${y} - ${z}` );
        })(a) // --> z   (cat)
      })(b)  // --> y   (dog)
    })(c)   // --> x   (horse)
  }

showName("cat", "dog", "horse");

примечание: ваш код не является замыканием;)

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