#javascript
#javascript
Вопрос:
Тема может быть немного загадочной, но вот моя проблема (возможно, из-за n00b?):
Для моего сайта у меня есть виджет, который пользователь может использовать на своем сайте как таковой (например):
<script type="text/javascript">
var widget_width ="300";
</script>
<script src="http://something/a.js" type="text/javascript"></script>
Теперь в файле .js я хочу проверить, объявил ли пользователь переменную widget_width. Итак, я подумал, что мог бы сделать что-то вроде (я хочу, чтобы переменная была пустой, «», потому что я тоже выполняю проверку на стороне сервера):
if(typeof widget_width == 'undefined') {
var widget_width = "";
}
Это не сработало, как и:
if(!widget_width) {
var widget_width = "";
}
Есть идеи о том, как объявить переменную, когда это необходимо таким образом?
Комментарии:
1. Я рекомендую немного более конкретное имя, чтобы избежать потенциального конфликта. Попробуйте использовать имя виджета. Что касается вашего вопроса, что вы подразумеваете под «не сработало», этот код в порядке.
2. Да, настоящее имя префикса переменной — «zgwidget», просто использовал кое-что в качестве примера. Под «не сработало» я имел в виду, что переменная отображается как «неопределенная», независимо от того, была ли она объявлена или нет.
Ответ №1:
удалите переменную. сделайте это >
if(typeof widget_width == 'undefined') {
widget_width = "";
}
Комментарии:
1. Хаха, так просто, да? Вау, думал, я уже пробовал это… Спасибо! Я пойду и немного посижу пристыженный в углу…
2. требуется немного времени, чтобы разобраться в Javascript. Не волнуйтесь, у вас все хорошо 🙂
Ответ №2:
В Javascript действуют правила определения области видимости — поэтому, когда переменная объявляется в зависимости от контекста, в котором сделано объявление (если внутри функции, она будет объявлена в текущей области видимости), переменная объявляется там.
Используя хитрость, вы можете получить переменную, объявленную в глобальной области видимости, если опустите ключевое слово ‘var’.
Что произойдет, так это то, что интерпретатор JS попытается найти эту переменную в текущей области видимости (то есть локальной, внутри функции), и поскольку он не может ее найти, он попытается выполнить поиск во всех родительских / окружающих областях, пока не достигнет глобальной (последней) области видимости.
Если переменной там тоже нет (и мы знаем, что это не из-за выполняемой вами проверки), она будет создана в последней области поиска, в данном случае глобальной.
Итак, удалите ключевое слово ‘var’, и все будет в порядке…
Комментарии:
1. хм, к тому времени, как я написал описание, люди уже предоставили ответы … извините…
2. Все в порядке — и спасибо за описание — всегда приятно изучать что-то новое =)
Ответ №3:
Это, вероятно, выходит за рамки данного вопроса, но я не хочу подчеркивать разницу между необъявленным и неопределенным, поскольку я много раз путал это.
Пожалуйста, посмотрите на следующий пример.
<script type="text/javascript">
var a
/* checking if defined variable a has value */
/* warning: this can't be used to check if variable is declared,
or it will raise an error */
if(a === undefined) {
//statement will execute
console.log('variable a has no value')
} else {
//statement will not execute
console.log('should not happen')
}
//checking if variable b is defined and has declared value
if(typeof b === 'undefined') {
//statement will execute
console.log('variable b has not been declared before')
} else {
//statement will not execute
console.log('should not happen')
}
</script>
Я думаю, что использовать ее для таких сценариев безопасно.
Для тех из вас, кто думает, что undefined можно перезаписать, согласно MDN
Пожалуйста, обратите внимание: В современных браузерах (JavaScript 1.8.5 / Firefox 4 ) undefined является неконфигурируемым, недоступным для записи свойством в соответствии со спецификацией ECMAScript 5. Даже если это не так, избегайте ее переопределения.
Ответ №4:
попробуйте с этим
if(widget_width == undefined)
{
var widget_width = "";
}
Комментарии:
1. Не очень хорошая идея, это вызовет ошибку ReferenceError, если переменная не была объявлена. Кроме того, вы должны проводить строгое сравнение с
undefined
объектом.
Ответ №5:
Я думаю, вы используете приведенный ниже код следующим образом.
<script type="text/javascript">
var widget_width = "300";
TTTTTTT();
</script>
and other your js file
function TTTTTTT() {
if (typeof widget_width == 'undefined')
{
alert("calling inner");
var widget_width = "";
}
}
Это работа….