【问题标题】:Closure and function hoisting- not working on firefox关闭和功能提升 - 不适用于 Firefox
【发布时间】:2016-11-06 14:17:03
【问题描述】:

以下代码在 Firefox 浏览器的某些版本上出现错误 - linksHandle is not defined

代码由一个函数组成,底部有一个名为 linksHandle 的函数。据我所知,这个函数应该在它定义的函数被调用时被提升。

因此,为事件“mMenuReady”定义的函数应该能够访问它,因为它包含了在其执行上下文中定义的所有函数和变量。

为什么某些 firefox 版本需要先定义函数声明 (linksHandle) 才能让 'mmenu' 回调包含函数?

document.addEventListener('readystatechange', function() {
    if (document.readyState === 'interactive') {

        if (typeof jQuery === 'function') {
            // callback function that is invoked later by the event that is triggered ->  $(window).trigger("mMenuReady")
            $(window).on('mMenuReady', function() {
                var links2 = Array.prototype.slice.call(document.querySelectorAll('#mm-mainMenu a'));
                links2.forEach(linksHandle);
            });
        }

        function linksHandle(elem) {
            // function code
        }
   }
});

【问题讨论】:

    标签: javascript function-declaration hoisting


    【解决方案1】:

    Function declarations inside blocks 仅从 ES6 开始被允许。它们确实会在您的 if 主体内提升(而不是整个功能),但不会在旧版本的 FF 中将它们实现为 "function statements" 而没有提升(实际上是 completely invalid in strict mode)具有 caused issues like yours

    【讨论】:

    • 如果代码不在 if 块中,并且在函数中立即贴花。 ES6 中是否提升了内部函数?我的问题是if语句对函数的提升有影响吗?
    • 是的,函数级函数声明在函数级范围内提升。
    • 但在更高级的 ES 中,该函数也在 if 块中被提升?
    • 是的,请参阅第一个链接问题中的说明。
    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多