关闭和功能提升 - 不适用于Firefox

时间:2016-07-04 20:13:26

标签: javascript function-declaration hoisting

以下代码在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
        }
   }
});

1 个答案:

答案 0 :(得分:1)

仅从ES6开始才允许

Function declarations inside blocks。它们会在if正文中提升(而不是整个函数),但在较早版本的FF中却没有将"function statements"实现为未被提升(实际上completely invalid in strict modecaused issues like yours