2014-11-03 109 views
1

我知道,那麼爲什麼JShint拋出這個錯誤JavaSript沒有塊級範圍:執行上下文混亂

可變warning可能尚未初始化。

function x(){ 
    if(y<allQuestions.length && document.getElementById('warning')<1) { 
     var warning = document.createElement('p'); 
     warning.id = 'warning'; 
     warning.appendChild(document.createTextNode('Please check an answer!')); 
     wrapper.appendChild(warning); 

     setTimeout(function(){ 
      if (document.getElementById('warning')) { 
       wrapper.removeChild(document.getElementById('warning')); 
      } 
     }, 2500); 

    }else{ 
     //HERE is the problem 
     warning.appendChild(document.createTextNode('Your response is still worng!')); 

    } 
} 

沒有其他statemenet它識別變量和代碼的作品。

+0

到變量的話題無關,就看你的測試,如果一個元素在DOM會的工作,但它做的事情一個非常奇怪的方式。當找不到元素時,'getElementById()'函數將返回'null'。 – Pointy 2014-11-03 14:44:38

+0

更好的聲明是document.getElementById('warning')!= null,對嗎? – GSG 2014-11-03 15:28:30

+0

是的,那是更典型的做法。 – Pointy 2014-11-03 15:41:22

回答

0

這是JSHint完全正確的情況。考慮一下你的代碼:warning在哪裏聲明和初始化?如果代碼使其成爲else子句,warning將如何具有值?

移動var聲明和初始化了if塊:

function x(){ 
    var warning = document.createElement('p'); 
    if (y<allQuestions.length && document.getElementById('warning')<1) { 

請記住,可變聲明被提升到功能上,而是可變初始化都沒有。因此,你的原代碼等同於:

function x(){ 
    var warning; 
    if (y<allQuestions.length && document.getElementById('warning')<1) { 
     warning = document.createElement('p'); 
     // ... 
+0

啊..我明白了!我試圖再次聲明一個具有相同名稱的變量,但JShint拋出'重複聲明'錯誤。 – GSG 2014-11-03 14:42:26