以下代码在 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
}
}
});
块内函数声明仅自 ES6 起才允许。它们确实在您的
if
体内提升(不是整个函数),但在旧版本的 FF 中则不然,旧版本的 FF 确实将它们实现为未提升的 “函数语句”(实际上 在严格模式下完全无效) 造成了像你这样的问题。