Как вызвать дочернюю функцию, которая объявлена ​​внутри другой функции - PullRequest
0 голосов
/ 08 мая 2019

Функция b объявлена ​​внутри функции a. Итак, я пытаюсь вызвать функцию b вне функции a. Это не вызывается.

var a = function() {
  alert("a");
  var b = function() {
    alert("b");
  }
}

Выход: - функция б называется Окно оповещения с сообщением b

Ответы [ 6 ]

1 голос
/ 08 мая 2019

Вам нужно вернуть b и использовать это. Это будет включать в себя вызов функции a для начала, но тогда у вас будет функция, которую вы могли бы вызывать повторно для оповещения b:

var a = function() {
  alert("a");
  var b = function() {
    alert("b");
  }
  return b;
}

var messageB = a();
messageB();
messageB();
0 голосов
/ 08 мая 2019

Все остальные ответы достаточно велики, но на всякий случай вам может понравиться такой подход directly calling inner function without returning этой функции.

Вы можете просто обернуть свою внутреннюю функцию, т. Е. b, в вашем случае как функцию, вызывающую себя, как эта,

var a = function() {
  alert("a");
  var b = (function() {
    alert("b");
  })()
}

Ref

0 голосов
/ 08 мая 2019

или, если вам понадобится подтверждение объекта

`var a = function() {
  print("a");
  this.b = function() {
    print("b");
  }
  return this
}
a().b()`
0 голосов
/ 08 мая 2019

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

Но вы можете пойти еще лучше, если вы захотите выставить более одной функции.

Вы можете просто вернуть объект с прикрепленными методами.

function A() {
  let value = 0;
  return {
    inc: () => ++ value,
    dec: () => -- value,
    show: () => console.log(value)
  }
}

const a1 = A();
a1.inc(); a1.inc(); a1.show();

const b1 = A();
b1.inc(); b1.dec(); b1.dec(); b1.show();

Теперь вышеприведенное выглядит очень похоже на то, что называется class, но это не так.Одним из недостатков этого является то, что если вы хотите создать тысячи экземпляров, класс будет лучше, поскольку он может поместить свои методы в прототип.Но, говоря о том, что, как было обнаружено с помощью React Hooks, это не так уж и плохо.

Одно большое преимущество вышеизложенного состоит в том, что вам не нужно попадать в мутный мир this контекста экземпляров..

Для полноты здесь приведена версия класса.

class A {
  value = 0;
  inc() { ++ this.value; }
  dec() { -- this.value; }
  show() { console.log(this.value) }
};

const a1 = new A();
a1.inc(); a1.inc(); a1.show();

const b1 = new A();
b1.inc(); b1.dec(); b1.dec(); b1.show();

Также было сказано, что простое решение состоит в том, чтобы сделать a и b обоими глобальными, но чем больше вы избегаете глобальных, тем лучше, поэтому, если aи b имеют какое-то общее намерение, лучше использовать замыкания или даже класс.

0 голосов
/ 08 мая 2019

Сначала верните эту функцию и вызовите ее,

var a = function() {
  alert("a");
  var b = function() {
    alert("b");
  }
  return b;
}

var b = a();
b();
0 голосов
/ 08 мая 2019

Попробуйте объявить переменную 'b' вне функции 'a':

var b;
var a = function() {
    alert("a");
    b = function() {
        alert("b");
    };
};

Таким образом, вы можете получить доступ к b извне a, так как оно объявлено вне ее.До того, как a был вызван в первый раз, это будет undefined, поэтому вы не можете позвонить b до a.Кроме того, если вы вызовете a дважды, предыдущий b будет переопределен, как показано здесь:

  var b;

  var a = function(name) {
    b = function() { alert(name); };
  };

  a("first version");
  b(); // first version
  a("second version");
  b(); // second version

Если вам не нужны внутренние переменные из a внутри b,нет смысла вкладывать функции, хотя в этом случае у вас должно быть две независимые функции:

  var a = function() { alert("a"); };
  var b = function() { alert("b"); };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...