Внешний Javascript с пространством имен, недоступный из целевого JavaScript - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть файл javascript:

foo.js

var FooNS = {
   T:5,
   S: FooNS.T+5, //ERROR1
   doSomething : function(adder)
   {
     //Do Something here.
   }
};

Это мой другой файл js:

useFoo.js

$(document).ready(function()
{
    FooNS.doSomething(5); //ERROR2
});

Это две ошибки Javascript (через Chrome Inspector), которые я получаю на своей странице, включая js:

  • ERROR1 -> Uncaught TypeError: Невозможно прочитать свойство 'T' из неопределенного ( foo.js )
  • ERROR2 -> Uncaught TypeError: Невозможно вызватьМетод doSomething из неопределенного ( в useFoo.js )

Я не могу выяснить причину этих ошибок / правильное использование пространств имен.Есть предложения?

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Причина для ОШИБКА1:

Вы пытаетесь получить доступ к свойству объекта, который не был полностью создан.Создание FooNS завершается только после того, как браузер (интерпретатор) выполняет строку 8 в вашем скрипте (т. Е. };).

Для инициализации свойств может быть лучше использовать функцию-член init или что-то в этом роде,и вызвать это определение FooNS, например:

var FooNS = {
   T: 5,
   S: 0,
   init: function() {
      this.S = this.T + 5; // this does not get executed till we call init(), so no error here
   },
   ...
}; // <- creation of FooNS object is complete
FooNS.init();

Причина ошибки ERROR2:

Браузер останавливается при первой ошибке (ERROR1) и больше не выполняет JS в этом потоке выполнения.,Из-за этого объект FooNS не создается правильно, что приводит к ошибке при вызове FooNS.doSomething(5)

1 голос
/ 13 декабря 2011

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

var FooNS = {
   T:5,
   S: T+5, // <-- here you are trying to access the global variable T
   doSomething : function(adder)
   {
     //Do Something here.
   }
};

То, что вы ищете, вероятно, сродни этому:

var FooNS = {
   T:5,
   doSomething : function(adder)
   {
     //Do Something here.
   }
};

FooNS.S = FooNS.T+5;

Вторая ошибка связана с тем, что FooNS никогда не создается как объект из-за первой ошибки, поэтому FooNS не определено.

...