Подтвердить что ты не робот

Как установить глобальную переменную из функции

Как установить глобальную переменную из функции?

$(document).ready(function() {
    var option = '';

    $("[name=select_option_selected]").change(function() { 
        var option = $(this).val();
        alert(option); // Example: Foo  
    });

    alert(option); // Need it to alert Foo from the above change function    
});
4b9b3361

Ответ 1

Объявить его вне области вашего jQuery onready

var option = '';

$(document).ready(function() {
    $("[name=select_option_selected]").change(function() { 
        option = $(this).val();
        alert(option); // Example: Foo  
    });

    alert(option); //This will never be "Foo" since option isn't set until that select list changes
});

если вы хотите инициализировать это текущее выбранное значение, попробуйте это:

var option = "";
var $select_option_selected = null;

$(function() {        
    $select_option_selected = $("[name='select_option_selected']")
    $select_option_selected.change(function() { 
        option = $(this).val();
    });    
    option = $select_option_selected.val();
});

Ответ 2

Плохой путь

Как указывают другие ответы, не рекомендуется создавать глобальные переменные. И, как они отмечают, вы можете создать глобальную переменную с помощью:

  • Объявление переменной вне всех функций
  • Инициализация вашей переменной без ключевого слова var
  • Или объявить его как свойство объекта window: window.options = 'blah';

Использование jQuery Data() Метод

Но есть лучший способ создать глобально доступное значение с помощью jQuery (и других библиотек). В jQuery используйте метод Data() для хранения значений, связанных с элементами DOM:

// store 'blah' at document root
$(document).data('mysite.option', 'blah');

// retrieve value
alert($(document).data('mysite.option'));

Обратите внимание на "mysite"... это хорошая идея для того, чтобы проставлять ваши ключи данных по той же причине, что и для глобальных пространств имен в javascript.

Ответ 3

$(document).ready(function() {
    var option = '';

    $("[name=select_option_selected]").change(function() { 
        option = $(this).val(); //no declaration of new variable, JavaScript goes to what encloses the function
        alert(option); // Example: Foo  
    });

    alert(option); // Need it to alert Foo from the above change function    
});

Ответ 4

Вы действительно хотите? глобальные переменные, как правило, следует избегать. В браузере window - глобальный объект, поэтому, если вы выполняете window.option = ..., тогда option будет доступен по всему миру.

Я настоятельно рекомендую назвать глобальную переменную чем-то более уникальным, чем "вариант", чтобы избежать сглаживания существующего материала.

Другой вариант, который я также не рекомендую: оставьте var

myvariable = 'foo';

Если myvariable никогда ранее не делится, он будет объявлен как свойство в окне, делая его глобальным. Обычно это считается (очень) плохая практика.

Ответ 5

Вы можете использовать префикс window. для доступа к глобальной переменной из области действия

window.option = ...;

Ответ 6

Два подхода, не упомянутые кем-либо другим, применимы, когда вы: 1. не имеете доступа к глобальной лексической среде, 10.2.3 и 2. пытаются написать код, который вы хотите поддерживать в системах, где прямая ссылка на глобальный объект 15.1 (например, window в HTML DOM или GLOBAL в Node [1]) не гарантируется:

  • Сделайте косвенный 15.1.2.1.1 вызовите eval, обернув его в избыточное PrimaryExpression, таким образом: (1,eval)(...) (оператор цифр и запятой не имеет смысла)... и затем вызывает его результат. Это заставляет код запускаться в глобальном контексте выполнения. 10.4.2

    Затем мы можем объявить 10.5 новую переменную в глобальной лексической окружающей среды, как было предложено выше; или, если на то пошло, делать что-либо еще, что мы желаем в этой среде:

    function global_define(ident, value){
       (1,eval) ("var "+ident+"; (function(v){ "+ident+" = v })") (value) }
    
  • Чтобы быть менее круглым (и, для загрузки, избегайте FUD -ridden eval), мы можем напрямую обращаться к глобальному объекту и устанавливать свойство 4.2 который затем будет доступен как глобальная переменная в другом месте нашего кода. [2]

    Вместо того, чтобы использовать описанный выше подход eval и получить доступ к глобальному объекту через код, который мы создали в глобальном контексте, оказывается, что мы можем получить доступ к глобальному объекту как значение this 10.4.3 в любой функции, вызываемой с помощью null:

    var global = (function(){ return this }).call(null)
    global[ident] = value
    

Уф.

Хорошо, больше читайте для тех из вас, кто не упал в обморок от ссылок на спецификацию и звонков eval, но:

  • @kangax полностью охватывает все базы , Серьезно, прочитайте, что если у вас есть какие-либо вопросы, на которые я не ответил здесь (в том числе те, которые касаются поддержки всех важных особенностей браузера!)
  • Очевидно, что соответствующие разделы самой спецификации ECMAScript 5, чтобы получить представление о том, как вещи предназначены для работы в идеальном мире. Нет, правда, правда; Я знаю, что спецификации - страшная идея, но спецификации ES ( "JavaScript" ) - одна из самых простых и понятных спецификаций, которые я когда-либо видел. Они действительно превосходны. Непосредственно и без особого порядка


[1]: обсуждение в других ответах, предполагающее, что exports в Node.js и других системах, совместимых с CommonJS, каким-то образом связано с глобальным объектом, о котором этот вопрос спрашивает, вводит в заблуждение. Что касается системного дизайна, то лучше всего использовать их инструменты для модулей среды, чем обманывать глобальный объект... но это обсуждение для другого сообщения. (=

[2]: для тех из вас, которые следуют в спецификации, сложнее продемонстрировать, что свойства-члены глобального объекта доступны в виде разломов идентификатора. Начните с 10.2.1.2 Записи объектной среды и 10.2.3 Глобальная среда, чтобы понять, как глобальный объект связан с окружающей средой, а затем перейти на 18.12.3, 18.12.2, и 18.12.1 в этом порядке совместно описывать [[Get]] на глобальном объекте.

Nota bene: Ни в коем случае в этой разработке я не предполагал, что выполнение любой из этих вещей было хорошей идеей. Или, в этом отношении, взаимодействие с глобальным охватом вообще - хорошая идея. Не имея никакого отношения к рассматриваемому вопросу, но предлагая успокоить мою совесть, я добавляю, что я завершаю весь свой собственный код в IIFE, начиная с самого начала файла; это, наряду с религиозным применением ключевого слова var, гарантирует, что я никогда не взаимодействую с обработкой JavaScript для глобального объекта вообще. Огромный беспорядок, избегали. Вы должны это сделать. Я так сказал. Я умный. (

Ответ 7

просто объявить глобальный объект

var obj={};
function my_function()
{
 obj['newVariable'] = 'someValue';
}

таким образом я достиг глобальной переменной.

Ответ 8

http://jsfiddle.net/Kba5u/

var foo = 'bar';

function changeFooToBaz(){
   foo = 'baz';
}

// changeFooToBaz();
console.log(foo); #=> 'bar'

Теперь раскомментируйте вызов changeFooToBaz:

var foo = 'bar';

function changeFooToBaz(){
   foo = 'baz';
}

changeFooToBaz();
console.log(foo); #=> 'baz'

changeFooToBaz действительно изменил содержимое foo, которая была объявлена ​​с большей областью действия, чем функция.