【问题标题】:Module pattern javascript not a function?模块模式javascript不是一个函数?
【发布时间】:2015-12-20 19:07:15
【问题描述】:

我正在尝试使我的 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
    });

理想情况下,我只想让宽松的时间工作,我不想显式调用构造函数。

例如松散时间(“foo”、“bar”、“etc”、“yolo”、“123321”);

我不确定我做错了什么,我需要返回函数本身而不是别名吗?

【问题讨论】:

  • 不知道为什么我被否决了。

标签: javascript module-pattern


【解决方案1】:
return {
    init: loosetime()
}

init调用 loosetime(即undefined,因为该函数没有return 语句)的返回值

如果您想分配函数本身而不是调用它,请删除 ()


您的第二个问题是显示模块模式要求您运行闭包

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

尽管您发表了评论,但您还是错过了那里的()

【讨论】:

  • 我已经有了,请看底部源码
  • @kaleeway — 我引用的代码取自您的问题,所以您当然拥有它。那个代码就是问题所在。阅读其余答案以了解如何解决它。
  • 谢谢,您的解决方案仍然给出结果松散时间。init() 不是函数。
【解决方案2】:

有两件事不对。

首先,您需要确保您的模块是自调用匿名函数 (SIAF),也就是立即调用函数表达式 (IIFE)。 您可以在here 找到有关此主题的更多信息。

其次,您不能在模块中调用 loosetime 函数,因为它不返回任何内容。您需要将 init 键的值作为对 loosetime 函数的引用。

var loosetime = (function () {

  // ...

  function loosetime(a, b, c, d, e) {
    // ...
  }

  // ...

  return {
    init: loosetime // Note that init has a reference to loosetime and we don't execute it.
  };

})(); // Note that you're missing the execution parentheses.

现在您可以调用init,然后您的模块中的loosetime 函数将被执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多