繁体   English   中英

无法更改函数内的全局变量(JavaScript)

[英]Can't change global variable inside function (JavaScript)

我有一个名为result和function的全局变量,目的是更改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);

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

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

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

  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); 

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

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

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

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); 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM