2013-03-08 63 views
0

我有以下功能:JS變量的作用域問題

function initPaymentBlock(bIdx) { 

    var paymentType = 'default'; 
    if($('#gc-apply-btn-'+bIdx).length) { 
     $('#gc-apply-btn-'+bIdx).click(function() { 
      poApplyGiftCard(bIdx); 
      console.log("about to change payment type"); 
      paymentType = 'credit card'; 
      console.log("paymentType inside function: " + paymentType); 
     }); 
    } 

    console.log("payment type: " + paymentType); 
    poGetPaymentOption(paymentType, 0, bIdx); 

} 

paymentType變量設置爲初始的語句中的「默認」。在內部點擊功能中,它被更改爲「信用卡」。當我在內部函數中運行console.log語句時,它返回credit cardconsole.log以外的內部函數(就在poGetPaymentOption調用之前)返回「默認」。

我知道問題是變量的範圍,但無法弄清楚我可以如何設置它,以便poGetPaymentOption函數調用獲取正確的值(如果未單擊按鈕之前就會點擊「默認」它運行;如果按鈕被點擊,則爲'信用卡'。)有人可以幫我嗎?

+0

認沽'poGetPaymentOption' click事件裏面?這實際上取決於你想要做什麼以及何時嘗試去做。 – Leeish 2013-03-08 22:26:28

+0

不能。在主函數中定義了其他函數,並且需要在所有函數之後調用其他函數。不想通過在每個內部函數中打電話來重複它。 – EmmyS 2013-03-08 22:28:17

+0

那麼,如果是這種情況,那麼當'poGetPaymentOption'運行時,'paymentType'將始終是它的初始值,因爲只有當有人點擊某件東西時它才能改變,並且從你剛纔所說的'poGetPaymentOption'在initPaymentBlock得到時運行跑。 – Leeish 2013-03-08 22:29:18

回答

1

它很明顯。點擊更改了值,但僅在點擊之後。您的第二個控制檯日誌在觸發點擊事件之前運行。這有什麼問題?

function initPaymentBlock(bIdx) { 

    var paymentType = 'default'; 
    if($('#gc-apply-btn-'+bIdx).length) { 
     $('#gc-apply-btn-'+bIdx).click(function() { 
      poApplyGiftCard(bIdx); 
      console.log("about to change payment type"); 
      paymentType = 'credit card'; 
      console.log("paymentType inside function: " + paymentType); 
      poGetPaymentOption(paymentType, 0, bIdx); 
     }); 
    } 
} 
1

範圍沒有問題。這都是關於執行的順序。

這裏是如何的代碼執行:

  • 當你進入initPaymentBlock功能,將它設置爲「默認」。
  • 然後,您創建一個點擊處理程序,將其值更改爲「信用卡」,但僅在有人點擊某個按鈕之後。
  • 然後您的控制檯輸出在底部輸出當前值,它仍然是'默認'。
  • 現在,如果用戶點擊該按鈕,單擊處理程序將執行,它會輸出「信用卡」

這裏是預期的控制檯輸出,當您運行initPaymentBlock()

  • 支付類型:默認

就是這樣。現在,當您單擊該按鈕,下面的輸出將顯示:

  • 即將改變內部功能的支付類型
  • paymentType:信用卡
+0

問題是,即使您單擊按鈕,底部的控制檯輸出仍會顯示默認值,而不是信用卡。 – EmmyS 2013-03-08 22:27:34

+0

最初調用'initPaymentBlock'函數時,底部的控制檯輸出只執行一次。點擊按鈕後,它不再執行。 – Steve 2013-03-08 22:29:57

+0

但它沒有。這就是我所說的。即使用戶點擊按鈕,它也不會輸出「信用卡」。 – EmmyS 2013-03-08 22:32:22