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

Например:

(function foo() {
  var a = 3;
  console.log(a);
});

var obj = {
  a: (function foo() {
    var a = 2;
    console.log(a);
  })
};

obj.a(); // 2
foo(); // ReferenceError: Not Defined

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

Изменения: для согласованности и ясности

1 Ответ

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

Вы путаете пару разных вещей здесь.

Ваше первое выражение - это выражение функции, не объявление функции:

(function foo() {
  var a = 3;
  console.log(a);
});

Это имя выражения функции ("foo "), но не вводит переменную foo в этой области.Если вы хотите ввести foo, чтобы он мог быть вызван снова, вам нужно либо объявление функции ...

function foo() {
  var a = 3;
  console.log(a);
}

foo();

, либо , вам нужно присвоить выражение функциипеременная:

var foo = function () {
  var a = 3;
  console.log(a);
}

foo();

Ваш следующий бит кода, объявление объекта, эффективно делает это, присваивая выражение функции переменной, obj.a:

var obj = {
  a: (function foo() {
    var a = 2;
    console.log(a);
  })
};

Ошибка вВаше мышление здесь связано с путаницей вокруг foo.В обоих случаях foo - это имя функции, но на самом деле оно не имеет отношения к вызову функции.Вы должны отбросить foo, потому что это только сбивает с толку.

По сути, ваш первый фрагмент эквивалентен:

(function () { alert('x'); });

Эта строка кода определяет анонимную функцию, но ничего не делаетс этим.Функция существует кратко, никогда не вызывается, а затем теряется, потому что она ни к чему не привязана.

Ваш второй фрагмент эквивалентен:

var x = function () { alert('y') };

Этот код определяет переменную,x и назначает ему функцию.Затем функцию можно вызвать с помощью x(), и функция остается доступной, пока x находится в области действия.


Ваш первоначальный вопрос:

Какможет ли объект получить доступ к выражению функции?

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

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