2013-02-18 5 views
1

Я новичок в мире javascript. Я анализирую код, описанный here, чтобы избежать загрязнения на глобальном уровне при написании расширения Firefox.
Когда кодО регистрации пространства имен в javascript

1. // Namespace registration 
2. this.ns = function(fn) { 
3. var ns = {}; 
4. namespaces.push(fn, ns); 
5. return ns; 
6. }; 

выполняет я не понимаю:
1) почему код объявить нс = {} в строке 3
2) почему код возвратные нс на линии 5
3) какая функция принимает возвращенную ns {} и как эта функция будет ее использовать
4) ns {} всегда одно и то же (?) Для каждого зарегистрированного пространства имен, поэтому почему в массиве namespaces вместе с fn и затем предоставляется, когда треска e выполняет fn.apply (ns), поскольку каждый раз он будет отличаться?
Извините за мой бедный английский и заблаговременно за вашу помощь.

ответ

3

Это не самый типичный способ реализации пространств имен, но он интересный. Я постараюсь ответить на ваши вопросы как можно яснее:

1. Поскольку функция, которая помещается в пространства имен массивов, должна иметь собственный контекст и не загрязнять глобальное пространство имен. Вы можете объявить:

extension.ns(function() { 
    this.myVar = 5; 
}); 

Каждый раз, когда ваша анонимная функция вызывается время this будет ns объект, соответствующий данной функции. Это связано с тем, как вызывается функция (используя apply).

2. Код возвращает ns, поскольку для контекстного объекта может потребоваться добавить дополнительные свойства или методы.

3. В данном примере нет. Если вы используете:

function foo() { 
    alert(this.bar); 
} 

var ns = extension.ns(foo); 
ns.bar = 'foobar'; 

когда функция foo вызывается из расширения, которое вы должны получить уведомление с текстом: «Foobar» (this в теле функции будет ns объект).

4. Каждый ns отличается. Когда вы используете ns = {}; каждый раз, когда вы создаете другой объект, ссылка указывает на разные объекты, поэтому каждый контекст для каждой объявленной функции отличается (для контекста вы можете думать о объекте ns).

+0

Спасибо! Я попытаюсь повторить анализ кода с дополнительной информацией, которую вы мне дали. – mty

+0

Добро пожаловать, если у вас появятся дополнительные вопросы, я буду рад помочь. –

Смежные вопросы