2014-12-12 3 views
0

Я строю игру и пытаюсь выяснить, как работает игровой движок melonJS. Я нахожусь в точке, где мне нужно создать собственную версию своего объекта CanvasRender, поэтому пыталась понять, что они сделали.Обтекание пространства имен с помощью функции самоисполнения

Зачем нужно обернуть рендеринг холста анонимной функцией самозапускания? Не могу ли я просто создать функцию как таковую?

me.CanvasRenderer = me.CanvasRenderer || {}; 

    me.CanvasRenderer = { 
     init: function() { 
     //... 

Или даже в пространстве имен:

var CanvasStuff = { 
     CanvasRenderer : function() { 

     } 
    }; 
    CanvasStuff.CanvasRenderer(); 

Я не понимаю, как они выложили этот код и цель. Как и когда вызывается (function() {?

Вот отрывок из их коды: (link to full code)

(function() { 

    // The canvas renderer object 
    me.CanvasRenderer = (function() { 
      var api = {}, 
      var canvas = null, 
      //... 
      api.init = function() { 
      //... 
      }; 
      return api; 
      //... 
    })(); 
})(); 
+0

читать дальше [singleton pattern] (http://www.dofactory.com/javascript/singleton-design-pattern) –

+0

Я думаю, что OP знает, что такое одноэлементный шаблон ... Там действительно нет причин для дополнительная упаковка. Возможно, они ожидали включения некоторых переменных в первую функцию self invoking. Таким образом, определение SEF поможет вам, поэтому вы не будете пропускать любые переменные. Его возможные другие объекты используют этот же шаблон, и разработчик не хотел нарушать шаблон – cgatian

+0

@cgatian, который является одноэлементным шаблоном, а ОП спрашивает, почему они это сделают, поэтому я склонен не соглашаться с вашим предположением об знаниях OP! –

ответ

2

самоосуществляющаяся функция выполняется немедленно, поэтому он похож на альтернативы вы вывешенные.

Однако преимущество функции самозапуска заключается в том, что вы можете объявлять переменные в пределах этой области, которые недоступны вне закрытия. Например, в опубликованном фрагменте кода есть var canvas, который доступен в любой из функций api, но недоступен для любого внешнего кода. В первом альтернативе, который вы предложили, нет способа объявить canvas без его доступности для любых клиентов/вызывающих абонентов api. Ваша вторая альтернатива (пространство имен) недостаточно заполнена, чтобы увидеть, как она будет использоваться, поэтому вы можете также обернуть частные ключи в это закрытие.

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