Область применения JavaScript: ссылка на элемент родительского объекта при закрытии дочернего элемента

#javascript #scope

#javascript #область действия

Вопрос:

Новичок в JavaScript здесь.

Как мне ссылаться на элемент foo изнутри элемента foobar , учитывая, что foobar он находится в закрытии?

 var priv = {

    foo: "bar",

    foobar: (function() {
        return this.foo === "bar";
    })()

};
  

Приведенный выше код завершается ошибкой. В нем this.foo есть undefined . Если я изменю this.foo на priv.foo , это все равно undefined . Как мне ссылаться priv.foo изнутри foobar закрытия?

Комментарии:

1. вы действительно хотите вызвать свое закрытие? Я бы попытался удалить () после })

2. К сожалению, я делаю. foobar на самом деле это несколько десятков строк. :/

3. Я объяснил в своем ответе ниже

Ответ №1:

Невозможно прочитать какие-либо свойства объекта в его определении во время его инициализации, поскольку prev в это время они не будут определены. Когда вы пытаетесь вызвать clojure внутри него, это ссылается на undefined this или priv .

Вероятно, вы хотели написать:

 foobar: (function() {
    return this.foo === "bar";
})
  

без () в конце. И тогда вы могли бы вызвать это как priv.foobar();

Если вам все еще нужно его вызвать, вы могли бы определить foobar после foo :

 var priv = {
    foo: "bar"
};

priv.foobar = (function() {
    return priv.foo === "bar";
})()
  

Ответ №2:

Проблема в том, что вы не определяете закрытие — я не думаю, что есть какой-либо способ получить доступ foo из вашей функции, поскольку priv она еще не инициализирована.

Что именно вы пытаетесь сделать? Следующее эквивалентно тому, что, как я понимаю, пытается сделать ваш образец, но я предполагаю, что я не понимаю проблему:

 // Set elsewhere
var foo = "bar";

var priv = {
    foo: foo ,
    foobar: foo == "bar"
};
  

Комментарии:

1. В итоге у меня есть гигантский JS-файл. Он определяет некоторые частные переменные и общедоступный объект. Я пытаюсь инкапсулировать эти частные переменные в один объект, но каждая частная переменная, за исключением одной, зависит от значения другой частной переменной. Итак, вместо этого предположим, что foobar это динамическое вычисление во время выполнения, основанное на значении foo . Имеет смысл?