Как установить глобальную переменную из функции
Как установить глобальную переменную из функции?
$(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
});
Ответы
Ответ 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" ) - одна из самых простых и понятных спецификаций, которые я когда-либо видел. Они действительно превосходны. Непосредственно и без особого порядка
- 10.4, Создание контекста выполнения: описывает, как обрабатываются "глобальный код" и "код eval".
- 10.2, Лексическая среда: Они описывают "где хранятся переменные". ( "Глобальная окружающая среда представляет интерес" ).
- 10.1, Типы исполняемого кода: Обнаруживает, что такое глобальный код и программы.
- 15.1, Глобальный объект: К сожалению, гораздо менее важно, чем его название, заставляет его звучать. Все еще стоит сэкономить.
[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
, которая была объявлена с большей областью действия, чем функция.