2017-09-28 20 views
0

我無法弄清楚如何更新我正在處理的JavaScript計算器的全局變量。我知道使用eval會使這變得更容易,但是從我在線閱讀的內容來看,不建議從用戶輸入中評估。更新全局變量爲javascript計算器

我的想法是存儲操作前來的第一個數字點擊。點擊後,存儲第二個數字,然後查看用戶出現的操作,其中'='或'+/* - '執行相應的操作。我還沒有完成CE或AC或'。'按鈕呢。完全沒有意義,如果我不能更新全局變量。

在函數本身中,我可以改變變量firstNum和secondNum。 從我在線閱讀的內容中,我相信我不會更改全局變量,而是變量的本地實例。

我希望能指出正確的方向來完成這件事。我試圖將數字存儲在一個對象中,然後在需要執行操作時引用該對象,但我不相信自從我收到參考錯誤後我做得很對。

預先感謝您。

var theParent = document.querySelector("#container"); 
var display = document.querySelector("#display"); 
theParent.addEventListener("click", doSomething, false); 
var reg = new RegExp('^\\d+$'); 
var result=0; 
var symbol=''; 
var firstNum=0; 
var secondNum=0; 




function doSomething(e) { 
    if (e.target !== e.currentTarget) { 
     var clickedItem = e.target.innerHTML; 
     if (reg.test(clickedItem)) { 
      if (display.innerHTML==="0"){ 
       display.innerHTML=clickedItem; 
      } 
      else { 
      display.innerHTML+=clickedItem; 
      } 
     } 
    } 


    if (clickedItem==='='){ 
    console.log('check firstNum:' +firstNum); 
    console.log('check symbol:'+ symbol); 
    console.log('operations return: '+ operations(symbol)); 
     result= operations(symbol); 
     console.log('result: '+ result); 
     display.innerHTML=result; 
     firstNum=result; 
     secondNum=0; 
     symbol=''; 
    } 

    if (!(reg.test(clickedItem))&&symbol===' '&&clickedItem!=='=') 
    { 
      symbol=clickedItem; 
      display.innerHTML='0'; 
      console.log('first op '+ symbol); 
    } 
    if (!(reg.test(clickedItem))&&symbol!==clickedItem&&clickedItem!=='=') { 
     solve(symbol); 
     symbol=clickedItem; 
     console.log('second op '+symbol); 
    } 


    if (symbol===''){ 

     //firstNum = parseInt(display.innerHTML); 
     setFirstNum(); 
     console.log("this firstNum in If: " +firstNum) 
    } 

    else if (reg.test(clickedItem)){ 
     setSecondNum(); 
     console.log("this secondNum in If: " +secondNum) 
    } 
    else {display.innerHTML='0';} 

    e.stopPropagation(); 
} 


function setFirstNum(){ 
    window.firstNum=parseInt(display.innerHTML); 
} 

function setSecondNum(){ 
    window.secondNum=parseInt(display.innerHTML); 
} 

function operations(symbol){ 
var operation=[{ 
    '+': firstNum + secondNum , 
    '-': firstNum - secondNum , 
    '÷': firstNum/secondNum , 
    'X': firstNum*secondNum 
}]; 
return operation[symbol]; 
} 


function solve(symbol){ 
    result=operations(symbol); 
     display.innerHTML=result; 
     firstNum=result; 
     secondNum=0; 
} 
+0

你可以使用eval來達到這個目的;這將是eval()的最佳用法之一,並使許多事情變得更簡單。要避免的是eval()其他用戶的內容,而不是你自己的;任何人都可以按[F12]來運行他們自己的代碼... – dandavis

回答

0

你正在引用全局變量好,問題是全局變量theParent。大多數情況下,瀏覽器在加載文檔之前執行javascript,因此找不到任何id爲#container的元素。

爲了解決這個問題,您可以聲明全局變量,並在加載文檔時定義它。

var theParent; 

window.onload = function() { 
    theParent = document.querySelector("#container"); 
    theParent.addEventListener(...); 
} 

類似的顯示變量。

希望這會有所幫助。

+0

我認爲適當的事件監聽器是'document.addEventListener(「DOMContentLoaded()=> {})」'。 – Andrew

+1

嗯,這裏沒有什麼比這更適合了:參考這個答案 https://stackoverflow.com/a/6348597/5810092 –

+0

但是我犯了一個錯誤,我現在編輯它,雖然 –