2014-02-20 3 views
2

Я пытаюсь создать некоторую изоляцию в javascript, используя шаблон модуля.Изоляция шаблона модуля Javascript

, но когда я запускаю этот код:

var mymap = {}; 

mymap['230'] = (function() { 
    privatePageLoad = function(nid, page){ 
     console.log('PAGE LOAD from 230: '+nid); 
    } 

    function handleDocummentAdded() { 
     console.log("New Document in 230!"); 
     privatePageLoad(230, 0); 
    }; 

    return { 
     newDocument: handleDocummentAdded 
    } 
})(); 

mymap['318'] = (function() { 
    privatePageLoad = function(nid, page){ 
     console.log('PAGE LOAD from 318: '+nid); 
    } 

    function handleDocummentAdded() { 
     console.log("New Document in 318!"); 
     privatePageLoad(318, 0); 
    }; 

    return { 
     newDocument: handleDocummentAdded 
    } 
})(); 

mymap['230'].newDocument(); 
mymap['318'].newDocument(); 

я получаю следующий результат:

New Document in 230! (index):29 
PAGE LOAD from 318: 230 (index):40 
New Document in 318! (index):44 
PAGE LOAD from 318: 318 

, но я ожидал:

New Document in 230! (index):29 
PAGE LOAD from 230: 230 (index):40 
New Document in 318! (index):44 
PAGE LOAD from 318: 318 

частный метод, который называется это всегда последний добавленный к карте ... Что я сделал неправильно?

Вот jsfiddle с ним http://jsfiddle.net/jpedro/4xdTA/

ответ

2

Вы забыли объявить "privatePageLoad" с var. Таким образом, это глобальная переменная.

Вы также можете использовать функцию оператор объявления:

mymap['230'] = (function() { 
    function privatePageLoad(nid, page){ 
     console.log('PAGE LOAD from 230: '+nid); 
    } 

    function handleDocummentAdded() { 
     console.log("New Document in 230!"); 
     privatePageLoad(230, 0); 
    }; 

    return { 
     newDocument: handleDocummentAdded 
    } 
})(); 

Кроме того, получить в привычку положить

"use strict"; 

в верхней части вашего кода. Это привело бы к ошибке в этом случае.

4

privatePageLoad не является частным. Добавить var, в противном случае privatePageLoad будет глобальным (то есть свойство глобального объекта (окно, модуль, что угодно))

Изменить код, чтобы что-то вроде:

var mymap = {}; 

mymap['230'] = (function() { 
    var privatePageLoad = function(nid, page){ 
     console.log('PAGE LOAD from 230: '+nid); 
    } 

    function handleDocummentAdded() { 
     console.log("New Document in 230!"); 
     privatePageLoad(230, 0); 
    }; 

    return { 
     newDocument: handleDocummentAdded 
    } 
})(); 

mymap['318'] = (function() { 
    var privatePageLoad = function(nid, page){ 
     console.log('PAGE LOAD from 318: '+nid); 
    } 

    function handleDocummentAdded() { 
     console.log("New Document in 318!"); 
     privatePageLoad(318, 0); 
    }; 

    return { 
     newDocument: handleDocummentAdded 
    } 
})(); 
Смежные вопросы