Глобальная переменная javascript внутри document.ready
Каков правильный способ объявления глобальной переменной javascript? Способ, которым я его пытаюсь, не работает.
$(document).ready(function() {
var intro;
if ($('.intro_check').is(':checked')) {
intro = true;
$('.intro').wrap('<div class="disabled"></div>');
};
$('.intro_check').change(function(){
if(this.checked) {
intro = false;
$('.enabled').removeClass('enabled').addClass('disabled');
} else {
intro = true;
if($('.intro').exists()) {
$('.disabled').removeClass('disabled').addClass('enabled');
} else {
$('.intro').wrap('<div class="disabled"></div>');
}
}
});
});
console.log(intro);
Ответы
Ответ 1
Если вы объявляете глобальную переменную, вы можете использовать какое-либо пространство имен. Просто объявляйте пространство имен снаружи, тогда вы можете бросить все, что захотите. Как это...
var MyProject = {};
$(document).ready(function() {
MyProject.intro = "";
MyProject.intro = "something";
});
console.log(MyProject.intro); // "something"
Ответ 2
объявить это
var intro;
вне $(document).ready()
, потому что $(document).ready()
скроет вашу переменную из глобальной области.
код
var intro;
$(document).ready(function() {
if ($('.intro_check').is(':checked')) {
intro = true;
$('.intro').wrap('<div class="disabled"></div>');
};
$('.intro_check').change(function(){
if(this.checked) {
intro = false;
$('.enabled').removeClass('enabled').addClass('disabled');
} else {
intro = true;
if($('.intro').exists()) {
$('.disabled').removeClass('disabled').addClass('enabled');
} else {
$('.intro').wrap('<div class="disabled"></div>');
}
}
});
});
Согласно комментарию @Zakaria
Другой способ:
window.intro = undefined;
$(document).ready(function() {
if ($('.intro_check').is(':checked')) {
window.intro = true;
$('.intro').wrap('<div class="disabled"></div>');
};
$('.intro_check').change(function(){
if(this.checked) {
window.intro = false;
$('.enabled').removeClass('enabled').addClass('disabled');
} else {
window.intro = true;
if($('.intro').exists()) {
$('.disabled').removeClass('disabled').addClass('enabled');
} else {
$('.intro').wrap('<div class="disabled"></div>');
}
}
});
});
Примечание
console.log(intro);
за пределами функции готовности DOM (в настоящее время у вас есть) будет записываться undefined
, но в готовности DOM он даст вам true/false.
Ваш внешний console.log
выполняется перед выполнением DOM, потому что DOM готов выполнить после того, как весь ресурс появился в DOM i.e после того, как DOM подготовлен, поэтому я думаю, что вы всегда получите абсурдный результат.
Согласно комментарию @W0rldart
Мне нужно использовать его вне функции готовности DOM
Вы можете использовать следующий подход:
var intro = undefined;
$(document).ready(function() {
if ($('.intro_check').is(':checked')) {
intro = true;
introCheck();
$('.intro').wrap('<div class="disabled"></div>');
};
$('.intro_check').change(function() {
if (this.checked) {
intro = true;
} else {
intro = false;
}
introCheck();
});
});
function introCheck() {
console.log(intro);
}
После изменения значения intro
я вызываю функцию, которая будет запускаться с новым значением intro
.
Ответ 3
JavaScript имеет функциональный уровень, что означает, что вам придется объявлять переменную вне функции $(document).ready()
.
Или альтернативно, чтобы ваша переменная имела область глобальная, просто не используйте ключевое слово var
перед тем, как показано ниже. Однако в целом это считается плохой практикой, потому что он загрязняет глобальную область видимости, но вам решать.
$(document).ready(function() {
intro = null; // it is in global scope now
Чтобы узнать больше об этом, проверьте:
Ответ 4
Используйте window.intro
внутри $(document).ready()
.
Ответ 5
вот так: поставьте intro
за пределы документа готов, Хорошее обсуждение здесь: http://forum.jquery.com/topic/how-do-i-declare-a-global-variable-in-jquery @thecodeparadox очень быстро: P в любом случае!
var intro;
$(document).ready(function() {
if ($('.intro_check').is(':checked')) {
intro = true;
$('.intro').wrap('<div class="disabled"></div>');
};
$('.intro_check').change(function(){
if(this.checked) {
intro = false;
$('.enabled').removeClass('enabled').addClass('disabled');
} else {
intro = true;
if($('.intro').exists()) {
$('.disabled').removeClass('disabled').addClass('enabled');
} else {
$('.intro').wrap('<div class="disabled"></div>');
}
}
});
});
Ответ 6
В отличие от других языков программирования любая переменная, объявленная вне любой функции, автоматически становится глобальной,
<script>
//declare global variable
var __foo = '123';
function __test(){
//__foo is global and visible here
alert(__foo);
}
//so, it will alert '123'
__test();
</script>
Проблема заключается в том, что вы объявляете переменную внутри функции ready()
, что означает, что она становится видимой (в области) ТОЛЬКО внутри функции ready()
, но не снаружи,
Решение:
Поэтому просто сделайте его глобальным, а затем объявите это за пределами $(document).ready(function(){});
Ответ 7
Используйте window.intro = "value";
внутри функции готовности. "value"
может быть void 0
, если вы хотите, чтобы он был undefined
Ответ 8
Вы можете определить переменную внутри функции готовности документа без var, чтобы сделать ее глобальной. В javascript любая переменная, объявленная без var, автоматически становится глобальной переменной
$(document).ready(function() {
intro = "something";
});
хотя вы не можете использовать переменную сразу, но она будет доступна для других функций