我在JavaScript文件中使用Jquery-3.2.1,Jquery-Ui 1.12.1。

window.TruyenOnlineScript = (function () {
    var _this = {};

    _this.init = function () {
        _this.initSearchMobile();
        _this.initSidebar();
    };

    _this.initSearchMobile = function () {
        //Open Input Search Mobile
        $('.js-open-search-box-mobile').on('click', function (event) {
            event.preventDefault();
            $('body').addClass('open-search-box');
            setTimeout(function () {
                $('#js-search-input-mobile').focus()
            }, 500);
        });
    };

    _this.initSidebar = function () {
        //Open Navbar Moblie
        $('.js-open-sidebar').on('click', function (event) {
            event.preventDefault();
            event.stopPropagation();
            $('body').addClass('open-sidebar');
        });
    };

})();

$('document').ready(function () {
    window.TruyenOnlineScript.init();
});


但是我得到了错误“未定义的初始值”:

javascript - 如何解决:“无法读取未定义TypeError的属性'init'”?-LMLPHP

谁能告诉我如何解决它?谢谢!

最佳答案

您正在将window.TruyenOnlineScript设置为立即调用函数表达式的返回值:

window.TruyenOnlineScript = (function () {
   . . .
})();


但是该表达式不返回任何值,因此window.TruyenOnlineScript最终成为undefined(这就是为什么您不能在init()上调用undefined的原因)。

您需要让IIFE返回一个对象供TruyenOnlineScript引用。



window.TruyenOnlineScript = (function () {
    var _this = {};

    _this.init = function () {
        _this.initSearchMobile();
        _this.initSidebar();
    };

    _this.initSearchMobile = function () {
        //Open Input Search Mobile
        $('.js-open-search-box-mobile').on('click', function (event) {
            event.preventDefault();
            $('body').addClass('open-search-box');
            setTimeout(function () {
                $('#js-search-input-mobile').focus()
            }, 500);
        });
    };

    _this.initSidebar = function () {
        //Open Navbar Moblie
        $('.js-open-sidebar').on('click', function (event) {
            event.preventDefault();
            event.stopPropagation();
            $('body').addClass('open-sidebar');
        });
    };

    return _this; // <-- Now this will be returned

})();

$('document').ready(function () {
    window.TruyenOnlineScript.init();
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

10-05 23:18