Javascript 能够在定义函数表达式之前使用它

Javascript 能够在定义函数表达式之前使用它,javascript,iife,hoisting,Javascript,Iife,Hoisting,根据定义函数表达式之前,不能调用函数表达式。我创建了一个模块,试图在定义IIFE之前访问IIFE函数。 根据我的理解,它应该给出一个错误,说cookieManager.setPerstistentCookie不是一个函数,但它工作正常。为什么 $(function(){ var selectedContainerClassName = $('.mtaa-iml-dropdwn-options li.mtaa-iml-selected').data('parent');

根据定义函数表达式之前,不能调用函数表达式。我创建了一个模块,试图在定义IIFE之前访问IIFE函数。 根据我的理解,它应该给出一个错误,说cookieManager.setPerstistentCookie不是一个函数,但它工作正常。为什么

$(function(){

        var selectedContainerClassName = $('.mtaa-iml-dropdwn-options li.mtaa-iml-selected').data('parent');
        cookieManager.setPersistentCookie(cookieManager.getCookieNameByComponent('imlookingTo') , selectedContainerClassName );

});

  var cookieManager  = (function(){

        var cookieEnum = {
            imlookingTo : "selectedUIContainer"
        }

        function getPerstistentCookieExpiryTime(){
            var expiration_date = new Date();
            expiration_date.setFullYear(expiration_date.getFullYear() + 1);
            return expiration_date.toGMTString();
        }

        var setPersistentCookie = function(cname, cvalue) {
            var expires = "expires="+ getPerstistentCookieExpiryTime();
            document.cookie = cname + "=" + cvalue + "; " + expires;
        }



        return {
            setPersistentCookie : setPersistentCookie,
            getCookieNameByComponent : getCookieNameByComponent
        }

})();

您已经将引用
cookieManager
的函数包装在jQuery“ready”处理程序中。在DOM准备就绪之前,该代码不会运行,因此在该时间定义了对象。换句话说,在定义之前,您没有使用它。

您已经将引用
cookieManager
的函数包装在jQuery“ready”处理程序中。在DOM准备就绪之前,该代码不会运行,因此在该时间定义了对象。换句话说,在它被定义之前,你不能使用它。

对不起,伙计们,我的错误是,我关于提升的说法是正确的,它不工作,也不应该像我解释的那样工作。 它之所以能正常工作,是因为我在
$(function(){})
代码段上方复制了相同的脚本代码段,但我忘记了将其错误删除。
无论如何,谢谢你们的帮助。

对不起,伙计们,我的错误我是对的,它不起作用,而且不应该像我解释的那样起作用。 它之所以能正常工作,是因为我在
$(function(){})
代码段上方复制了相同的脚本代码段,但我忘记了将其错误删除。
无论如何,感谢您的帮助。

时间方面的
$(..)
必须在代码的其余部分之后执行,这可能是因为
$()
显式地等待加载DOM,而在您的情况下,这恰好还没有发生。(现在这是一个句子。)只有在分配错误之前尝试调用它,才会得到错误。只要定义了cookieManager(它是用var声明的),就可以了。函数表达式不会被提升。仅承载声明。按时间顺序
$(..)
必须在其余代码之后执行,这可能是因为
$()
显式地等待加载DOM,而在您的情况下,这恰好还没有发生。(现在这是一个句子。)只有在分配错误之前尝试调用它,才会得到错误。只要定义了cookieManager(它是用var声明的),就可以了。函数表达式不会被提升。仅承载声明。cookieManager也是IIFE@user2181397-那无关紧要。RHS被计算并返回一个值,它是否来自IIFE或任何其他类型的表达式并不重要IIFE@user2181397-那无关紧要。RHS被计算并返回一个值,它是否来自IIFE或任何其他类型的表达式并不重要。