【问题标题】:javascript variable scope - how can i work around this?javascript 变量范围 - 我该如何解决这个问题?
【发布时间】:2013-07-18 23:20:23
【问题描述】:

我有一个输入字段,用户可以在其中输入一个INPUTVALUE,这个INPUTVALUE 会根据正则表达式检查正确性,然后发送到一个 php 文件,该文件将使用它进行计算,然后返回0(表示INPUTVALUE 无效)或RETURNVALUE。这个RETURNVALUE 应该显示在网站上ID 为#VALUEINFO 的元素中。我也希望我的函数get_value_by_input() 返回这个RETURNVALUE。为了检查返回的内容,我首先显示警报。

(一个实际的应用可能是例如订单上的优惠券代码......输入您的优惠券代码,我们在数据库中检查它,它返回优惠券的价值,如果它不是有效的,则返回 0优惠券代码。)

我的问题是,我一定在 Javascript 中弄乱了变量范围,因为即使我的 #VALUEINFO 显示正确的 RETURNVALUE,警报总是会显示 no returnvalue specified

function get_value_by_input()
{
    var returnvalue;
    var valueinfo = $('#valueinfo');
    valueinfo.text('');
    var inputvalue = $("input[name='inputvalue']").val();
    var correctinput = /^[a-zA-Z]*$/i;
    if( inputvalue.length > 0 && correctinput.test(inputvalue))
    {
        $.post('ajax/valuecheck.php', {inputvalue_test: inputvalue}, function(is_valid){
            if(is_valid == 0)
            {
                       valueinfo.text('Sorry, this input is not working...');
                       returnvalue = 0;
            }
            if(is_valid != 0)
            {
                      valueinfo.text('the returned value for your input is '+is_valid);
                      returnvalue = is_valid;
            }
        });
    }
    else
    {
        if(inputvalue)
        {
            valueinfo.text('Invalid input.');
            returnvalue = 0;
        }
    }

    if(returnvalue)
    {
        alert('the value for this input was was '+returnvalue);
        return returnvalue;
    }
    else
    {
        alert('no returnvalue specified.');
        return 0;
    }
}

再次: 即使#VALUEINFO 给了我正确的返回值,为什么这段代码总是提示“未指定返回值”?

我认为这与 if 块有关,我读到 javascript 不会忽略 if 块中任何变量的设置,即使条件不满足...但是我怎么能将值传递给 # valueinfo 并同时返回? 任何帮助或建议将不胜感激! :-)

编辑:

嗯,是的,它与变量范围无关,但它与 Asynchronus-jax 有关。 我最终重组了我的代码……get_value_by_input() 现在更像是一个process_input() 函数。首先检查INPUTVALUE 的正确性,并且只有在没有错误的情况下才会调用$.post(...。然后在回调函数中立即使用 php 文件返回的值,而不是返回然后从另一个函数中使用......不幸的是,我无法让我的大脑专注于使用 .done() 或类似的东西,猜我今天已经为此工作太久了... -.- 也许下一次。它现在有效:)

【问题讨论】:

  • 这不是范围问题。这是一个异步问题。您需要在回调、回调调用的函数或对保证 Ajax 回调已经执行的 Deferred 对象的回调中使用返回值。您目前正在尝试在回调执行之前使用returnvalue
  • 是的,很有可能……对不起!
  • 我想我很偏离轨道...感谢 cmets。我将在我的回答中包括我是如何解决它的。

标签: javascript ajax jquery asynchronous


【解决方案1】:

如 cmets 中所述,您需要在回调中处理返回值(因为您正在处理异步调用)。

这可能会让您更好地了解如何解决问题:

function getReturnValue(inputvalue, callback){
    $.post('ajax/valuecheck.php', { 'inputvalue_test': inputvalue}, callback);
}

var inputvalue = $("input[name='inputvalue']").val();

getReturnValue(inputvalue, function(is_valid){
    //handle is_valid here
    //it's the data returned from the ajax call
});

类似的threads还有很多。

【讨论】:

  • 我想我有点跑题了...感谢您的帮助!
  • @olli 没问题 - 很高兴为您提供帮助!
猜你喜欢
  • 1970-01-01
  • 2020-03-12
  • 2020-03-25
  • 2020-02-14
  • 2014-11-11
  • 1970-01-01
相关资源
最近更新 更多