2017-07-20 154 views
0

我有這段JavaScript代碼,並且我希望它能夠在第二個函數中使用calculate(),但是問題在於第一個函數使用第二個函數中聲明的變量。此外,我需要var first=prompt僅在調用chemicalcalc時執行。第一個函數使用第二個函數中的變量,但第二個函數也調用第一個函數

function calculate(){ 
    var calctrans=parseInt(firsttrans, 10) 
    return calctrans; 
} 

function chemicalcalc(){ 
    var first=prompt("Enter first term\nLeave bank to go back to element finder"); 
    if(first==""){ 
    calculate(); 
    }else{ 
    var firsttrans=first.replace("h", 1); 
    } 
} 

chemicalcalc(); 
+0

爲什麼您需要首先通過firsttrans來計算()?你說你想調用calculate()如果first是一個空字符串,但根據你當前的代碼聲明一個單獨的firsttrans變量的要點是用1代替所有的h,所以它不會在您完成此操作後調用calculate(),或者可能跳出該函數/如果第一個字符串是空字符串,則執行其他操作? – ajc2000

+0

即使你可以訪問'firsttrans',它也不會被定義,因爲調用'calculate'時沒有給它賦值。它只在'else'部分給出一個值,你不叫'calculate'。此外,你沒有對「計算」返回的值做任何事情......所以,也許你可以解釋你想要發生的事情。 – trincot

回答

0

通過嵌套的chemicalcalccalculate(),你讓calculate能夠訪問父函數的範圍。

然而,如果用戶不輸入任何東西,只是打在提示符處輸入,你的代碼將調用calculate,然後將嘗試使用firsttrans,它不會有一個值,因爲if的分支該設置值沒有輸入,所以你在那裏有一個邏輯錯誤。

我已經刪除了if/then邏輯來顯示該函數的其餘部分如何工作。

function chemicalcalc(){ 
 
    var first = prompt("Enter first term\nLeave bank to go back to element finder"); 
 
    
 
    var firsttrans = first.replace("h", 1); 
 
    
 
    // Invoke calculate and return whatever it returns 
 
    return calculate(); 
 
    
 
    // Nested functions always have access to the parent's scope 
 
    function calculate(){ 
 
    var calctrans = parseInt(firsttrans, 10) 
 
    return calctrans; 
 
    } 
 
} 
 

 
console.log(chemicalcalc());

另一種選擇(而不是嵌套函數)是簡單地通過第二函數它需要爲參數的數據:

function chemicalcalc(){ 
 
    var first = prompt("Enter first term\nLeave bank to go back to element finder"); 
 
    
 
    var firsttrans = first.replace("h", 1); 
 
    
 
    // Invoke calculate and pass it the data it needs, then return whatever it returns 
 
    return calculate(firsttrans); 
 
} 
 

 
// Now the function expects data to be passed by the caller 
 
function calculate(data){ 
 
    var calctrans = parseInt(data, 10) 
 
    return calctrans; 
 
} 
 

 
console.log(chemicalcalc());

+0

這似乎是有道理的,但當我試過了,輸入「h」後,什麼都沒有發生?可能是因爲calculate()被調用超出了它定義的範圍嗎? – KrazyKoder22

+0

@ KrazyKoder22我不確定你的意思。當我運行這個並輸入時,說「h23」,我得到「123」輸出。 –

+0

好吧,它現在正在工作。有時當我在另一個函數中嵌套函數時,我的ide告訴我要將嵌套函數移到函數體根目錄。爲什麼不說這個代碼? – KrazyKoder22

相關問題