关闭和功能提升 - 在 firefox 上不起作用

问题描述 投票:0回答:1

以下代码在 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 ecmascript-6 scope hoisting javascript-function-declaration
1个回答
1
投票

块内函数声明仅自 ES6 起才允许。它们确实在您的

if
体内提升(不是整个函数),但在旧版本的 FF 中则不然,旧版本的 FF 确实将它们实现为未提升的 “函数语句”(实际上 在严格模式下完全无效造成了像你这样的问题

© www.soinside.com 2019 - 2024. All rights reserved.