Если не объявлено, объявить переменную?

#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 = "";
  }
 }
  

Это работа….