Невозможно изменить глобальную переменную внутри функции (JavaScript) - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть глобальная переменная с именем 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);

Предупреждение ничего не возвращает, однако, если я помещаю предупреждение ВНУТРИ функции, оно возвращает ответ в порядке. Это кажется легким, но я не могу понять это.

Функция вызывается перед всем этим кодом.

Ответы [ 4 ]

0 голосов
/ 05 сентября 2018

Это потому, что AJAX асинхронный. Значение кода неблокирующее. Представьте, что вызов AJAX передается другому потоку для обработки, пока выполняется остальная часть кода. Предупреждение срабатывает до того, как AJAX-запрос получит ответ. Вот почему, если вы делаете предупреждение внутри обратного вызова, это работает.

0 голосов
/ 05 сентября 2018

Вы должны сначала вызвать функцию, чтобы заполнить переменную результата.

var result = []; //in global scope
function storeResponse(response) {
    window.result = response;
}
storeResponse('callSomething');
alert(result);
0 голосов
/ 05 сентября 2018

Вы сказали, что сначала вызываете функцию, поэтому у вас должно быть что-то вроде этого:

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 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);
0 голосов
/ 05 сентября 2018

Здесь нужно знать две вещи:

  1. var result отличается от window.result, поэтому используйте window.result = "Test";, а не объявление var.
  2. Вам нужно вызвать storeResponse() перед alert кодом, чтобы он установил новое значение, а затем получить это значение в alert.

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