2015-10-07 3 views
1

Почему JavaScript выдает ссылочную ошибку, если мы попытаемся использовать переменную, которая не объявлена, но позволяет установить значение для нее?Использование нераскрытых переменных в javascript

например

a = 10; //creates global variable a and sets value to 10 even though its undeclared 
alert(b); // throws reference error. 

так почему при Ь, его эталонным ошибки, а не для а?

+2

потому, что в случае а = 10 она устанавливает переменную, а в случае тревоги (б) он ищет переменную и не может найти его. – guramidev

ответ

7

Вот как работает язык. В нестрогом режиме назначение необъявленного символа неявно рассматривается как создание глобальной переменной. В строгом режиме это ошибка.

Чтобы использовать строгий режим, глобальный блок сценария или функция должна начинаться с утверждением:

"use strict"; 

То есть, простое утверждение выражение, состоящее из строки "use strict". Это предотвратит случайное создание глобальных переменных (которые все еще могут быть созданы явно) и наложить несколько других ограничений.

3

Согласно documentation:

Объявление переменного, везде, где они происходят, обрабатывается до любого кода выполняется. Объем переменной, объявленной с var, представляет собой текущий контекст выполнения , который является либо закрывающей функцией, либо для переменных, объявленных вне любой глобальной функции.

Присвоение значения необъявленной переменной неявно создает его как глобальную переменную (она становится свойством глобального объекта) при выполнении назначения . Разница между заявленным и необъявленных переменных:

  1. Объявленные переменные ограничены в контексте исполнения, в котором они были объявлены. Необъявленные переменные всегда глобальны.

  2. Объявленные переменные создаются до выполнения любого кода. Необъявленные переменные не существуют до тех пор, пока не будет присвоен им код .

console.log(a);    // Throws a ReferenceError. 
console.log('still going...'); // Never executes. 

var a; 
console.log(a);    // logs "undefined" or "" depending on browser. 
console.log('still going...'); // logs "still going...". 
<ол начать = "3">
  • Заявленные переменные являются не-конфигурируемых свойство их контекста выполнения (функция или глобальные). Необъявленные переменные: настраиваемый (например, можно удалить).
  • Из-за этих трех отличий отказ объявить переменные , скорее всего, приведет к неожиданным результатам. Таким образом, рекомендуется, чтобы всегда объявлял переменные, независимо от того, находятся ли они в функции или глобальной области. И в строгом режиме ECMAScript 5 присвоение необъявленной переменной вызывает ошибку.

    3

    a = 10;
    внутренне объявляет var a т.е. в фоновом режиме он сначала объявляет переменную глобально, а затем установить значение этой переменной.

    Поэтому, когда мы пишем a=10 , что происходит на самом деле:
    var a;
    a=10;
    поэтому a никогда не undefined;

    но alert(b) в этом случае b не имеет значения, определенные таким образом, остается undefined

    И как сказал Понтий,

    В нестрогого режима, назначение необъявленной символ неявно рассматривается как создание глобальная переменная. В строгом режиме это ошибка.

    Его всегда лучшая практика для использования use strict

    +0

    b не является неопределенным. Его фактическая ошибка ссылки. – Parashuram

    +0

    b не определено, поэтому его не удалось найти ссылку. –

    Смежные вопросы