2015-05-20 3 views
-2

Я пытаюсь использовать шаблон раскрывающегося модуля для охвата JavaScript на моей странице, чтобы я не загрязнял глобальное пространство имен.JavaScript раскрывает глобальную переменную шаблона шаблона undefined

<script type="text/javascript"> 
    var myModule = (function(){ 
    function windowLoad() { 
     // window onLoad things 
     return; 
    } 

    function otherFunc(){ 
     // otherFunc things 
    } 

    window.onload = windowLoad; 

    return { otherFunc: otherFunc }; 
    })(); 

    myModule.otherFunc(); // myModule is undefined here 
</script> 

По какой-то причине, как показано в комментарии выше, myModule неопределен, когда я иду, чтобы использовать его. Зачем?

+0

«myModule здесь не определен». Что заставляет вас думать так? Это ** не ** 'undefined'. – undefined

+1

Единственное, что не определено, это результат 'myModule.otherFunc', который ожидается, поскольку вы ничего не возвращаете. См. Http://jsfiddle.net/4065yLcv/1/ –

+1

@Juan Это не вопрос OP, так как 'otherFunc' может делать некоторые вещи, но не возвращать какое-либо значение. Проблема заключалась в том, что 'myModule' не определен, хотя на самом деле он определен. Вы явно не понимали проблему OP. – MaxZoom

ответ

3

myModule не является неопределенным. Это объект, который вы вернули из своей вызываемой функции; То, что не определено, является результатом вызова myModule.otherFunc, потому что эта функция ничего не возвращает.

Для получения пояснения см. Следующий фрагмент.

var myModule = (function() { 
 
    function windowLoad() { 
 
     // window onLoad things 
 
     return; 
 
    } 
 

 
    function otherFunc() { 
 
     return 1; 
 
    } 
 

 
    window.onload = windowLoad; 
 

 
    return { 
 
     otherFunc: otherFunc 
 
    }; 
 
    })(); 
 

 
    console.log(myModule); // object {otherFunc: function otherFunc(){...}} 
 
    console.log(myModule.otherFunc()); // 1

0

Как уже упоминалось, ваш код работает, как написано. Как вы его написали, otherFunc возвращает undefined, поскольку у него нет оператора return, чтобы явно вернуть значение.

При отладке что-то вроде этого, то лучше рассматривать как объект и функции вы вызываете отдельно:

console.log(myModule); // should print [Object object] 
console.log(myModule.otherFunc); // should print a function definition 

Вы также можете попробовать добавить возврат к otherFunc:

function otherFunc() { 
    return "This is otherFunc's return." 
} 
Смежные вопросы