Области видимости при вложении объектов / функций - PullRequest
0 голосов
/ 05 октября 2018

Я относительно новичок в JS и пытаюсь понять, как работает область действия с дочерними объектами / функциями.

Например:

const b = {
  c: () => {
    console.log("C", foo)
  }
}
const x = (foo) => {
  console.log("X", foo)
  return {
    a: () => {
      console.log("A", foo)
    },
    b: b 
  }
}

i = x("FOO")
i.a()
b.c()

Я надеюсь увидетьвывод FOO во всех 3 случаях - однако я действительно вижу:

X FOO

A FOO

Uncaught ReferenceError: foo не определена в Object.c

Я пытаюсь создать функцию, в которой все ее методы фактически сопоставлены с внешними / импортированными методами, но, так как им всем нужен доступ к foo, это не работает.Есть ли способ, которым b (c) может получить доступ к foo?Или альтернативный способ справиться с этой ситуацией?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

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

function makeB(foo) {
  // `foo` is in scope here
  return {
    c() {
      console.log("C", foo)
    }
  };
}

function x(foo) {
  // `foo` is in scope here
  console.log("X", foo)
  return {
    a() {
      console.log("A", foo)
    },
    b: makeB(foo), 
  };
}

const i = x("FOO");
i.a();
i.b.c();
0 голосов
/ 05 октября 2018

переместите определение b в возвращаемый объект функции x

const x = (foo) => {
console.log("X", foo)
return {
  a: () => {
    console.log("A", foo)
  },
  b: {
    c: () => {
      console.log("C", foo)
    }
  }
}

}

, теперь у вас будет доступ к foo благодаря замыканию.

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