2015-12-20 4 views
-1

Я пытаюсь сделать мой яваскрипт код прилипает к шаблону модуля, который я следую здесь:Модуль javascript не является функцией?

http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

Это мой код в настоящее время нет никаких проблем синтаксиса, кроме вызова во время выполнения, который говорит

loosetime.init() не является функцией.

var loosetime = (function() { 
    var looseconfig = { 
     "format": "DD/MM/YY HH24:MM:SS.s", 
     "value": "DD/MM/YY 00:00.00", 
     "class": "input", 
     "delims": ['/', '-', '_', '.', '|', ',', ' ', ':'] 
    }; 

    function loosetime(a, b, c, d, e) { 
     var format = a; 
     var appendLoc = b; 
     var inputVal = c; 
     var inputName = d; 
     var inputClass = e; 
     var inputLength; 

     try { 
      if (typeof(format) == 'undefined') { 
       format = looseconfig.format; 
      } else { 
       format = parseDateTime(format); 
      } 

      try { 
       if (typeof(inputVal) == 'undefined') { 
        inputVal = looseconfig.value; 
       } 

       inputLength = inputVal.length - 2; 
       var input = document.createElement("input"); 
       input.setAttribute("name", inputName); 
       input.setAttribute("maxlength", inputLength); 
       input.setAttribute("size", inputLength); 
       input.setAttribute("value", inputVal); 
       input.setAttribute("type", "input"); 
       input.setAttribute("class", inputClass); 
       input.setAttribute("onkeypress", "dateTimeRules(event)"); 
       input.setAttribute("onclick", "resetCursorPos(event)"); 
       input.setAttribute("loosetime", format); 

       try { 
        var element = document.getElementById(appendLoc); 

        element.appendChild(input); 
       } catch (e) { 
        window.alert("Error, no Element given to append loosetime to.") 
       } 
      } catch (e) { 
       window.alert("Error, Value is invalid." + e.toString()); 
      } 
     } catch (e) { 
      window.alert("Error, Date format missing or invalid."); 
     } 
    } 

    // other code here ... 

    return { 
     init: loosetime() 
    } 

    // end private closure then run the closure 
    }); 

В идеале я просто хочу loosetime работать, я не хочу, чтобы явно вызвать конструктор.

например. loosetime («foo», «bar», «etc», «yolo», «123321»);

Я не уверен, что я делаю неправильно, мне нужно вернуть функцию, а не псевдоним?

+0

Не уверен, почему я получаю downvoted. – kaleeway

ответ

1

Есть две вещи неправильно.

Прежде всего, вы должны убедиться, что ваш модуль является самоназывающей анонимной функцией (SIAF), a.k.a немедленно вызывается функциональное выражение (IIFE). Вы можете найти более подробную информацию по этой теме here.

Во-вторых, вы не можете вызвать функцию loosetime внутри вашего модуля, потому что она ничего не возвращает. Вам нужно значение init, чтобы быть ссылкой на функцию loosetime.

Теперь вы можете вызвать init и loosetime функции внутри модуля будет выполняться.

+1

Спасибо за помощь! – kaleeway

3
return { 
    init: loosetime() 
} 

init этого значение возвращения из вызывающихloosetime (который undefined так, что функция не имеет return заявления).

Удалите (), если вы хотите назначить функцию, а не позвонить.


Ваша вторая проблема заключается в том, что показательна картина модуль требует, чтобы вы запустить закрытие:

//end private closure then run the closure 
})(); 

Несмотря на свой комментарий, вы пропустили от в () там.

+0

У меня уже есть это, пожалуйста, посмотрите на исходный код внизу – kaleeway

+1

@kaleeway Попробуйте более внимательно прочитать ответ. – Oka

+0

@kaleeway - Код, который я цитировал, взят из вашего вопроса, так что, конечно, у вас оно есть. Этот код является проблемой. Прочитайте остальную часть ответа, чтобы узнать, как его исправить. – Quentin