JavaScript如何从函数中获取变量

5

我不是JavaScript专业人员,而且在网上搜寻了很长时间。

我有一个问题,就是无法从另一个函数中获取变量。我的代码看起来像这样:

var variabeltje;
$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()},
  function(data) {
    alert(data);
    variabeltje=data;
  }
);
alert(window.variabeltje);

变量variabeltje必须从数据中获取信息。当我在variabeltje=data下面放置警报时,它能够正常工作,但是我需要在函数之后使用数据变量。

编辑:

根据其他人的建议,我已经对其进行了更改,现在它变成了这样:

                var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()});
                XHR.done(function(data) {
                    console.log(data); 
                    getData(data);
                }); 

                function getData(data) {
                if(data == 'true') {
                    alert(data);
                    $(this).unbind('keypress');
                    $(this).html($(this).find('input').val());
                }
                }

但现在$(this)没有传递到函数中。我该如何解决这个问题?

下面的答案解释了原因,但并没有提供解决方案,因为不清楚你想要做什么。这是因为如果不知道你的具体需求,很难给出确切的解决方案。例如,在这段代码中修复问题的好方法是将警告向上移动两行,但在实际代码中可能并不适用。 - Jasper
感谢您的回答。在文件handle_time.php中,我正在进行验证并将其编辑到数据库中。如果成功编辑,则会返回true;变量也必须获得true值。然后,在警报之后,我想检查它是否为true,并显示内容或不显示。 - Marnix
那么,我想你不应该在$.post()调用之后(即请求发送后)尝试这样做。相反,你应该在传递给$.post()的函数内部执行此操作,该函数将在请求完成后执行。 - Jasper
3个回答

4
由于它是异步的,数据只能在ajax调用完成后才能使用,因此您需要修改您的代码以适应该需求并等待ajax完成后再执行相关操作:
var XHR = $.post('js/ajax/handle_time.php', {time: $(this).find('input').val()});

XHR.done(function(data) {
    console.log(data);
});

或者在其他函数中:
function XHR(time){
   return $.post('js/ajax/handle_time.php', {time: time});
}

function doStuff(element) {
    XHR($(element).find('input').val()).done(function(data) {
        console.log(data);
    });
}

编辑:

根据您的编辑,看起来这是一个作用域问题:

var self = this,
    XHR = $.post('js/ajax/handle_time.php', {time: $(self).find('input').val()});

XHR.done(function(data) {
    console.log(data); 
    getData(data);
}); 

function getData(data) {
    if(data == 'true') { //normally you'd try to pass true as a boolean, not string
      alert(data);
      $(self).unbind('keypress').html($(self).find('input').val());
    }
}

非常感谢。只有一个问题,当我将这个放入函数中时:$(this).html($(this).find('input').val()); 我该如何将 $(this) 传递到 XHR.done(function(data) { 中呢? - Marnix
你需要确定作用域和this是什么,然后如果需要,就像处理其他任何变量一样,使用一个变量或将其传递给函数,以避免作用域问题。 - adeneo

2
这是因为$.post方法是异步运行的。请看SO上这个问题。修改建议:将post方法后面的部分放在成功触发的匿名函数的主体内。如下所示:
$.post('js/ajax/handle_time.php', {'time': $(this).find('input').val()},
  function(data) {
    alert(data);
    variabeltje=data;
    alert(window.variabeltje); // or whatever function you need to call, call it here...
  }
);

1
问题在于post方法是异步执行的。也就是说,一个post请求被发送到服务器,但执行流程继续进行,因此您的警报尝试访问一个尚未设置的值,因为post请求还没有返回。
如果您需要同步执行,可以使用ajax方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接