2013-03-08 66 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