【问题标题】:Can't change global variable inside function (JavaScript) [duplicate]无法更改函数内部的全局变量(JavaScript)[重复]
【发布时间】:2019-02-10 11:34:48
【问题描述】:

我有一个名为 result 的全局变量和一个函数,目的是改变 result 的值。这是我尝试过的代码:

checkdate();

function checkdate() {
    //defining startdate,enddate,hotel_id

    $.ajax({
    method: 'GET',
    url: '/checkdate',
    data: {startdate : startdate, enddate : enddate, checkroom : 1, hotel_id : hotel_id},
    success: function(response){
        storeResponse(response);
    }
    });
}

var result = [];
function storeResponse(response) {
    window.result = response;
}
alert(result);

警报不返回任何内容,但是如果我将警报放在函数内部,它会返回响应。这似乎很容易,但我无法弄清楚。

在所有这些代码之前调用该函数。

【问题讨论】:

  • 请注意,取决于var result = [] 所在的位置,它不会在窗口对象上可用。有关该代码执行位置的上下文的更多信息会有所帮助。
  • 请添加更多代码,作为您在代码中调用函数的位置以及您尝试提醒的位置

标签: javascript variables scopes


【解决方案1】:

这里有两件事你需要知道:

  1. var resultwindow.result 不同,因此请使用 window.result = "Test"; 而不是 var 声明。
  2. 您需要在alert 代码之前调用storeResponse(),以便它设置新值,然后在alert 中获取该值。

window.result = "Test"; //in global scope
function storeResponse(response) {
    window.result = response;
    console.log(window);
}
storeResponse("Hello");
alert(result);

【讨论】:

  • 它在所有这些代码之前被调用,正如我所说,如果我将警报放在函数内部,一切正常
  • @HessamShekhasnay 如果您将警报放入其中,它将始终有效。但是您需要在警报之前提醒函数调用将在哪个外部。如果这不起作用,请发布您的实际代码
  • @AnkitAgarwal 请查看已编辑的问题。谢谢。
【解决方案2】:

您应该首先调用该函数,以便填充结果变量。

var result = []; //in global scope
function storeResponse(response) {
    window.result = response;
}
storeResponse('callSomething');
alert(result);

【讨论】:

    【解决方案3】:

    你说你是先调用函数,所以你必须有这样的东西:

    storeResponse('someResponse');
    var result = []; //in global scope
    function storeResponse(response) {
        window.result = response;
    }
    
    alert(result);
    

    问题如下:

    1. 在第一行中,您正在调用您的函数。该函数在窗口中设置一个新的result var,全局作用域

    2. 在第二行中,您将覆盖 result var: var result = []; 它允许您使用空数组,这就是警报看起来为空的原因

    尝试注释第二行,它会起作用:

    storeResponse('someResponse');
    //var result = []; //in global scope
    function storeResponse(response) {
        window.result = response;
    }
    
    alert(result);
    

    或者更好的是,先声明 var:

    var result = []; 
    storeResponse('someResponse');
    
    function storeResponse(response) {
    result = response; // You don't need to use window (if the var is not declared inside the function, is global by default)
    }
    
    alert(result);

    【讨论】:

      【解决方案4】:

      那是因为 AJAX 是异步的。这意味着代码是非阻塞的。 想象一下 AJAX 调用被传递给另一个线程进行处理,同时执行其余代码。在 AJAX 请求收到它的响应之前触发警报。这就是为什么如果您在回调中发出警报,它会起作用。

      【讨论】:

      • 解决办法是什么?目标是将ajax响应存储在全局变量中。和堆栈溢出的其他答案没有帮助。
      • 它确实存储了它。它只是在您请求它时不可用。您需要在成功获取响应后查询该值。使用事件是一个很好的用例。使用这么多的代码无法提供完整的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多