2016-07-04 30 views
1

下面的代码给了一个错误,在某些版本的Firefox浏览器 - linksHandle is not defined关闭和功能hoisting-不工作在Firefox

该代码是由在底部有一个名为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

Function declarations inside blocks只允许从ES6开始。他们吊起你的if身体内(而不是整个函数),而不是在旧版本的FF那确实实现它们,"function statements"的未悬挂(实际上completely invalid in strict mode),具有caused issues like yours

+0

如果代码不是如果块内,并被decalred在功能的时候了。是ES6中的内在功能? 我的问题是if语句对函数的提升有影响吗? – user3021621

+0

是的,函数级函数声明在函数级范围内被挂起。 – Bergi

+0

但是在更高级的ES中,函数也会在if块中挂起? – user3021621