Почему я не могу получить доступ к возвращенной функции с синтаксисом точки - PullRequest
0 голосов
/ 30 августа 2018

Я думаю, что после запуска createFunction у меня будет доступ к внутренней функции.

function createFunction() {
  function printHello() {
    return console.log("hello");
  }
  return printHello;
}

// Both of these return undefined
createFunction(printHello());
createFunction.printHello();

Есть мысли?

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Я думаю, что после запуска createFunction у меня будет доступ к внутренней функции.

Нет, вы не можете получить доступ к переменной, которая находится внутри функции за ее пределами. Если вы вызываете функцию, эти переменные существуют, но вы не можете получить к ним доступ. Однако, если значение получает return ed, вы можете работать с вызовом функции, как если бы это было выражение. В вашем случае вы возвращаете функцию, чтобы получить к ней доступ:

 var print = createFunction();
 print();

Или как вкладыш:

 createFunction()();
0 голосов
/ 31 августа 2018

В вашем коде createFunction возвращает другую функцию, поэтому для выполнения внутренней функции вы должны вызвать внутреннюю функцию путем добавления () после возвращаемого значения createFunction i.e createFunction () ();

createFunction () предоставляет printHello = определение функции
createFunction () () аналогично printHello ** () **

Также, если мы упростим ваш код, мы можем переписать его как

function printHello() {
     console.log("hello");
 };
function createFunction() {
  return printHello;
};
console.log("return value of: createFunction()");
console.log(createFunction());

console.log("return value of: createFunction() () --> printHello()");
createFunction()();
0 голосов
/ 30 августа 2018

Правильный синтаксис:

createFunction()();

... или немного более многословно:

const returnedFunction = createFunction();
returnedFunction();

... as printHello name имеет смысл только в пределах createFunction, но его значение на самом деле возвращается этой функцией. И да, вполне нормально поместить любое число () в нужную вам последовательность.

В качестве идентификатора возвращать результат console.log('hello') не имеет смысла: ведение журнала само по себе является побочным эффектом, нет необходимости проверять его результат.

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