Как обрабатывать локальные функции в шаблоне раскрывающего модуля, которые возвращают это

Мне нравится раскрывающийся шаблон модуля. У меня будут частные функции, которые я хотел бы сделать общедоступными и вернуть их. Но у меня также могут быть некоторые локальные функции в моем раскрывающем шаблоне модуля, которые "возвращают это"...

var player = function(){
//my local variable scope...

oplayer.damage = function(){
    if(!this.grace){
        this.shield--;
        if (this.shield == 0){
            return this;
        }
    }
};
      ...

      return {
      damage : oplayer.damage
      }
      }();

Можно ли «вернуть это», если я явно что-то возвращаю? (в контексте использования шаблона раскрывающегося модуля). Если нет, то как я могу преобразовать свою локальную функцию oplayer.damage для использования в соответствующем контексте? Спасибо за любой совет! Я просто пытаюсь осознать всю концепцию «вернуть это».


person klewis    schedule 02.10.2012    source источник
comment
Поскольку Player в верхнем регистре, разве это не должен быть конструктор?   -  person Bergi    schedule 02.10.2012
comment
Откуда oplayer?   -  person bfavaretto    schedule 02.10.2012
comment
Оо - хороший звонок, который может обесценить мой ответ. Я думаю, нам нужно увидеть часть этого кода!   -  person ndtreviv    schedule 02.10.2012
comment
Я преобразовываю свою функцию конструктора в раскрывающий шаблон модуля, поэтому изначально у меня было oplayer = this; Но если в моем случае это не нужно, я с удовольствием все поменяю. Изучаю этот материал впервые.   -  person klewis    schedule 02.10.2012


Ответы (2)


Это должно быть хорошо, потому что «это» зависит от контекста выполнения. Поскольку вы возвращаете это в общедоступной функции, которая является частью «урезанного» объекта, вы получите только урезанный объект. Итак, я думаю, что то, что вы пытаетесь сделать, должно быть в порядке, если вы рассмотрите следующие сценарии:

var test = function(){
   var pri = function(){
       console.log("Private");
   };

   var pub = function(){
       pri();
       console.log("pub");
       return this;
   }

   return {
       pub: pub
   };
}();

console.log(test.pri); //-> undefined
console.log(test.pub); //-> function(){…}
console.log(test.pub()); //-> "Private" "pub" [Object {…}]
console.log(test.pub().pri); //-> "Private" "pub" undefined
person ndtreviv    schedule 02.10.2012
comment
Что вы имеете в виду под private pub? Он просто возвращает test - person Bergi; 02.10.2012
comment
@Bergi, если вы запустите test.pub(), он выведет в консоль текст Private, за которым следует pub. - person ndtreviv; 02.10.2012
comment
@Bergi - скопируйте и вставьте его в консоль FireBug и нажмите «Выполнить». - person ndtreviv; 02.10.2012
comment
Ах хорошо; хотя в вашем примере строка будет выводить "private" "pub" [Object], а последняя строка будет выводить "private" "pub" undefined - немного запутанно, так как в первых двух строках вы прокомментировали результат внешнего журнала - person Bergi; 02.10.2012
comment
Спасибо ndtreviv - это мне очень помогает - person klewis; 02.10.2012
comment
@Bergi, верно, потому что pub() возвращает объект, а я записываю в console.log результат вызова. Хотите, чтобы я поправил? - person ndtreviv; 02.10.2012
comment
@Bergi, ну, я исправил его, чтобы показать вывод FireBug, а вы изменили его, чтобы показать вывод консоли IE. Хо хм. - person ndtreviv; 02.10.2012
comment
@ndtreviv: я вообще не знаю, что такое консоль IE… Я только хотел исправить последнюю строку и немного отформатировать - person Bergi; 02.10.2012
comment
nedtreviv, вам пришлось использовать return this; или вы могли бы также использовать возврат; в любом случае будут ли те же комментарии, что и в вашей демонстрации? - person klewis; 02.10.2012
comment
@blachawk Если бы я не вернул это, то test.pub().pri выдал бы ошибку. Попробуйте сами — вставьте весь код в окно консоли FireBug, удалите this после оператора return и нажмите «Выполнить». - person ndtreviv; 02.10.2012

Пожалуйста, сначала проверьте, что такое ключевое слово this, есть хорошее введение в MDN.

Можно ли «вернуть это», если я явно что-то возвращаю?

Ну конечно; естественно. Это шаблон по умолчанию для цепочки методов — все возвращает объект, для которого он был вызван. Однако, чтобы полагаться на это, вам нужно будет возвращать его в любом случае, а не только тогда, когда щиты отключены.

Если это не было вашей целью, просто используйте обычный оператор return; (результат undefined похож на оператор без возврата).

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

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

преобразовать мою функцию для использования в правильном контексте?

(Я предполагаю, что с помощью "context" вы ссылаетесь здесь на объект this)

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

person Bergi    schedule 02.10.2012
comment
Спасибо Берги. Я думаю, что просто хочу вернуть true для oplayer.damage. Причина в том, что я проверю это позже вне модуля... if(mplayer.damage) { //тогда сделайте что-нибудь!} - person klewis; 02.10.2012