Javascript jQuery模块函数意外返回';未捕获类型错误';?

Javascript jQuery模块函数意外返回';未捕获类型错误';?,javascript,jquery,module,Javascript,Jquery,Module,我正在尝试使用模块模式构建搜索功能: 运行时,我收到以下错误: script.js:28未捕获类型错误:无法读取属性“validateTerm” 未定义的 我正在单击带有空白#searchInput字段的#searchErrors按钮,希望searchFunc验证该术语,然后显示#searchErrorsdiv,并将我的错误消息附加在其后面。导致此错误的原因是什么?上面的代码中没有任何内容可以A)使搜索项不是未定义的,或者B)使其具有validateTerm属性(如果是)。分配给searchT

我正在尝试使用模块模式构建搜索功能:

运行时,我收到以下错误:

script.js:28未捕获类型错误:无法读取属性“validateTerm” 未定义的


我正在单击带有空白
#searchInput
字段的
#searchErrors
按钮,希望searchFunc验证该术语,然后显示
#searchErrors
div,并将我的错误消息附加在其后面。导致此错误的原因是什么?

上面的代码中没有任何内容可以A)使
搜索项
不是
未定义的
,或者B)使其具有
validateTerm
属性(如果是)。分配给
searchTerm
时调用的函数不会返回任何内容,因此调用该函数会导致
未定义。在函数内部声明变量不会使该变量在函数外部可访问(幸运的是)

我无法理解您试图用代码做什么,但模块模式基本上是这样的(在ES5及更早版本中):

关键事项:

  • 我们返回一些东西,通常是一个对象

  • 我们为该对象指定属性,以显示“模块”(作用域函数)之外的内容

  • 其他地层:

    var thing = (function() {
        function bar() {
        }
    
        return {
            foo: function foo() {
            }
        };
    })();
    

    或者使用ES2015(目前您仍需要传输才能在野外使用ES2015):


    所有这些都导致
    thing
    引用一个对象(我们在
    return
    上使用对象初始值设定项创建的对象),其属性
    foo
    引用
    foo
    函数,并且是一个完全私有的
    bar
    函数,只有
    foo
    可以访问。

    对不起,我上面的评论是错误的(可能)不正确

    在validateTerm函数中,您在每个if块内定义“错误”-在if块外无法访问此项

    如果您在If语句之外定义了error,它将正确返回。(为了清楚起见,我将其重命名为returnError,以便您可以看到上面定义的错误与函数中的错误之间的区别。)

    此外,我可以看到您之前定义了“error”-因此我猜您希望将validate行简化为以下内容:-

    error = searchFunc.validateTerm(term);
    

    因为您希望将从函数返回的值分配给错误变量以供以后使用。

    您是否尝试将
    var validateTerm=function(term){
    替换为
    this.validateTerm=function(term){
    ?\over
    searchFunc.validateTerm(term)
    对术语进行console.log操作,它很可能是未定义的-尝试调整第5行以读取
    var term=$(“#searchInput”).val()| |“;
    -很可能是您的搜索术语框ID的命名有错误,这是脚本中的第28行?第28行是:searchFunc.validateTerm(术语);我认为您没有正确地遵循该模式。搜索函数未定义,因为这是您定义它的内容。如果在方法中有一个随机事件。preventDefault(),那么它就没有意义了。
    var thing = (function() {
        function bar() {
        }
    
        return {
            foo: function foo() {
            }
        };
    })();
    
    var thing = (function() {
        var t = {};
    
        function bar() {
        }
    
        t.foo = function foo() {
        };
    
        return t;
    })();
    
    var thing = (function() {
        function bar() {
        }
    
        return {
            foo() {
            }
        };
    })();
    
    var validateTerm = function(term){
                var returnError = "";
                if (term === ''){
                    returnError = 'Please enter a search term';
                }
                else if (!regex.test(term)){
                    returnError = 'Please enter only alphanumeric characters (numbers and letters).';
                }
                return returnError;
            };
    
    error = searchFunc.validateTerm(term);