JS变量范围问题

时间:2013-03-08 22:22:43

标签: javascript scope

我有以下功能:

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 card。内部功能之外的console.log(在poGetPaymentOption通话之前)返回'默认'。

我知道问题是变量的范围,但无法弄清楚我可以设置它的方式或位置,以便poGetPaymentOption函数调用获得正确的值('默认&# 39;如果按钮在运行之前没有被点击;'信用卡'如果点击按钮。)有人可以帮助我吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

范围没有问题。这都是关于执行的顺序。

以下是代码的执行方式:

  • 当您输入initPaymentBlock函数时,将其设置为“default”。
  • 然后您创建一个单击处理程序,将其值更改为“信用卡”,但仅在某人单击按钮后。
  • 然后你底部的控制台输出会输出当前值,这仍然是'默认'。
  • 现在,如果用户点击该按钮,则会执行点击处理程序并输出“信用卡”

以下是运行initPaymentBlock()时预期的控制台输出:

  • 付款方式:默认

就是这样。现在,当您单击该按钮时,将显示以下输出:

  • 即将更改付款类型
  • paymentType内部功能:信用卡