2016-07-04 5 views
1

다음 코드는 일부 버전의 Firefox에서 Firefox - linksHandle is not defined로 오류를 발생 시켰습니다.폐쇄 및 기능 호이 스팅 - 파이어 폭스에서 작동하지 않음

코드는 아래쪽에 linksHandle이라는 함수가있는 함수로 구성됩니다. 내가 아는 한이 함수는 정의 된 함수가 호출 될 때이 함수를 끌어 올리도록되어 있습니다.

따라서 'mMenuReady'이벤트에 대해 정의 된 함수는 실행 컨텍스트에 정의 된 모든 함수와 변수를 포함하므로 해당 함수에 액세스 할 수 있어야합니다.

왜 함수를 둘러싸 기 위해 'mmenu'콜백을 사용하기 위해 일부 firefox 버전에서 함수 선언 (linksHandle)을 정의해야합니까?

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 본체 안에서 (전체 기능이 아닌) 호이스트를 수행하지만 호이스트되지 않은 "function statements" (실제로는 completely invalid in strict mode)으로 구현 된 FF의 이전 버전에서는 caused issues like yours을 갖지 않습니다.

+0

코드가 if 블록 안에 없으면 함수에서 바로 제거되었습니다. ES6에 내장 된 내부 기능 이었습니까? 내 질문에 if 문이 함수의 권상에 영향을 미칩니 까? – user3021621

+0

예, 함수 수준 함수 선언은 함수 수준 범위에서 끌어 올립니다. – Bergi

+0

더 진보 된 ES에서 함수는 if 블록에서도 끌어 올 수 있습니까? – user3021621