Могут ли функции обращаться к переменным, определенным в его собственной родительской функции? - PullRequest
0 голосов
/ 19 февраля 2019

Ресурс разработчика Mozilla содержит два противоречивых объяснения, касающихся области действия функции.

Здесь указывает, что даже если «переменная определена в той же области, что и вызовы функции», код выдаст ошибку, поскольку «она не определена в определениях функций».

Пример)

function myBigFunction() {
  var myValue;

  subFunction1();
}

function subFunction1() {
  console.log(myValue);
} //this will show a reference error

Однако здесь указывает, что «функция, определенная внутри другой функции, может также обращаться ко всем переменным, определенным в ее родительской функции, и любой другой переменной дляк которой родительская функция имеет доступ ".

Пример)

function getScore() {
  var num1 = 2,
      num2 = 3;

  function add() {
    return name + ' scored ' + (num1 + num2);
  }

  return add();
} //this is ok

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

В вашем первом примере

function myBigFunction() {
  var myValue;

  subFunction1();
}

function subFunction1() {
  console.log(myValue);
} //this will show a reference error

здесь myValue включено в функцию myBigFunction(), поэтому имеет область видимости блока.

Область видимости блока означает любой код в этом блоке (здесь функцияопределяет блок) может использовать эту переменную, если функция содержит другую функцию (определение функции) и внутреннюю функцию, использующую эту переменную, то она будет передана в замыкании на внутреннюю функцию.2-й сценарий точно такой же, как я объяснил здесь.

function getScore() {
  var num1 = 2,
      num2 = 3;

  function add() {
    return name + ' scored ' + (num1 + num2);
  }

  return add();
} //this is ok

В вышеприведенном примере num1 и num2 объявлены в функции getScore(), и у него есть внутренняя функция add(), так как add function использует num1 и num2, это будетпередается как закрытие функции add(), и при доступе к этим переменным ошибки не будет.

, но в первом примере переменная доступна вне области видимости и как переменная, доступ к которой находится вне этой функции, она выиграла 'Он будет недоступен, и он выдаст ошибку ссылки.

Я надеюсь, что объяснение прояснит ваше понимание.чтобы понять это полностью, ознакомьтесь с концепцией JavaScript и концепцией замыкания.

0 голосов
/ 20 февраля 2019

Используйте ключевое слово this, чтобы получить родительскую переменную, т.е.

var bar = function () {
  this.foo = "example";//the only catch is you have to have the this key word when defining the term.
  var subfunction = function () {
    this.foo = "This an example!";
  }
}

(надеюсь, это поможет!)

0 голосов
/ 19 февраля 2019

Причина, по которой первый пример дает сбой, а второй «работает», связана с областью действия и закрытием.Вы можете думать о «фигурных скобках» функции как о оболочке вокруг ее области действия или сферы влияния.

Первый пример завершается ошибкой, поскольку переменная myBigFunction() недоступна для области действия subFunction1().myBigFunction() также не переносит subFunction1(), что обеспечит закрытие. Проверьте здесь замыкания .

Однако, add() объявлен в рамках функции getScore().getScore() 'wraps' add() - обеспечивает закрытие, чтобы add() имел доступ к переменным в области видимости getScore().

...