2013-04-06 12 views
1

Вопрос - как передать переменную в глобальную область? :Как передать переменную в глобальную область

var global_variable;

chrome.storage.local.get('ABC',function(result){ 
      global_variable = result; //pass result to global var. 
}); 

console.log(global_variable); //outputs undefined, why!!!? 
+3

Эта функция называется «асинхронно». –

+0

Я когда-то писал (объяснение непрофессионала проблемы, с которой вы столкнулись) (http://stackoverflow.com/a/11689804/938089?after-calling-chrome-tabs-query-the-results-are-not -доступный). Он следует той же структуре, что и ваш код, поэтому вам должно быть легко быстро перейти. –

+0

Я мог бы заметить, что ни одно из этих решений не выполняет то, что задает ОП ... и это должно было «переместить» переменную в глобальную область. Все эти ответы только присваивают значение другой переменной уже в глобальной области действия, а не переносят исходную переменную в глобальную область ... jus say'n;) – Epiphany

ответ

1

Вы установки переменной внутри функции обратного вызова асинхронной. Обратный вызов запускается после завершения действия get.

Ваш код будет выполняться в следующем порядке:

chrome.storage.local.get("ABC",callback); 

затем

console.log(); 

затем

callback() 

Вы можете убедиться, что, поставив console.log заявление в обратного вызова и видя, что он работает после текущего.

Функции Javascript завершаются до того, как они запускают любые асинхронные обратные вызовы.

Это может иметь больше смысла, как это, что эквивалентно тому, что у вас есть прямо сейчас.

//define the callback 
function callbackFunction(result){ 
     global_variable = result; //pass result to global var. 
} 

//run the get. When it is complete the callback will be added to a queue 
//to run next after current operations have completed 
chrome.storage.local.get('ABC',callback); 

// this will run immediately after the get call 
console.log(global_variable); 

Если вы хотите работать с переменной вы должны поставить логику в функции обратного вызова (или в отдельной функции, вызываемой функции обратного вызова.

2

Это просто потому, что console.log() запускается до 'ABC',function(result){ установки глобальной переменной.
Потому что chrome.storage.local.get запускается асинхронно.

Чтобы verifiy его, проверить этот код:

var global_variable; 
chrome.storage.local.get('ABC',function(result){ 
     global_variable = result; //pass result to global var. 
     test(); 
}); 
function test() { 
    console.log(global_variable); 
} 
0

Я предполагаю, что, не зная, что возвращаемый значение «результат» означает, что вы хотите передать значение глобальной области видимости переменной, которая не была предопределена. Следующее изменение обратного вызова будет определять новую переменную с глобальной областью и присваивать ей значение «результатов» Помните, что область видимости связана с иерархией внутри объекта окна, а не с сценарием.

function callbackFunction(result){ 
    window.global_variable = result; 
} 
console.log(global_variable); 

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

function callbackFunction(result){ 
    var js = document.createElement('script'); 
    js.src = 'var global_variable = ' + result + ';'; 
    var first = document.getElementsByTagName('script')[0]; 
    first.parentNode.insertBefore(js, first); 
} 

Хотя я считаю, что это кажется немного подробным для достижения тех же результатов.

Смежные вопросы