簡體   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