2015-05-31 12 views
5

Моя проблема Ложь здесь Я изучаю JavaScript, но не новичок в программировании вообще. Я понимаю подъем, но в строгом режиме это не должно приводить к ошибке и быть пойманным либо при назначении 6 для необъявленной переменной, либо document.getElement ... присваивается x, это не приводит к ошибке, поэтому мой диагноз таков: подъем все еще продолжается. Я не люблю и хочу избавиться от использования строгого режима. Использование Chrome Версия 42.0.2311.152 м, как мой браузер«использовать строгий» не останавливать подъем в области функций

function strictMode(){ 
    'use strict'; 
    try { 
     x = 6; 
     document.getElementById('hoisting').innerHTML = x; 
     var x; 
    } 
    catch(err) { 
        document.getElementById('error_report').innerHTML = 
         "There was an error that occured (Were in Strict Mode)" + 
          " " + err.message; 
       } 
} 
+1

Я не думаю, что строгий режим намеревается удалить подъем – GillesC

+0

Я прочитал, что он сделал, и именно поэтому он породил мой вопрос ... Я читал, что с разных сайтов –

ответ

9

Объявление переменного (т.е. var x;) справедливо для всего объема они написаны в, даже если вы объявите после назначения. Это то, что имеется в виду под номером "hoisting": var x; поднят до начала области, а назначение x = 6; - это хорошо, потому что x был объявлен где-то в этой области.

Strict mode ничего не меняет. Это будет выбросить ошибку, если вы вообще опустили объявление var x;; без строгого режима область видимости переменной будет неявно глобальной областью.

В ES2015 (a.k.a. ES6) подъем с помощью let вместо var. (Другое отличие состоит в том, что переменные, объявленные с помощью let, являются локальными для окружающего блока, а не для всей функции.)

+0

Хорошая заметка о неявной глобальной сфере применения, традиционно все, что объявлено в функциональная область была доступна и «живая» на протяжении самой функции. Вы говорите, что строгий режим - это единственный способ вернуть область видимости традиционным путям? –

+0

До тех пор, пока вы усердно пишете свои объявления 'var', строгий режим не имеет никакого значения. Переменные все еще ограничены блоком, в котором они объявлены, даже без строгого режима. Строгий режим доступен только для того, чтобы поймать вас, если вы _forget_ объявите переменную. – Thomas

+0

Также обратите внимание, что «живое» - это совершенно другая концепция от «быть в сфере видимости». Например, если я напишу 'function foo() {var x = {}; return x; } 'then' x' будет только в области видимости внутри 'foo', но его значение может« жить »в течение гораздо более длительного времени, в зависимости от того, что делает вызывающий. – Thomas

0

Есть некоторые странные вещи, которые javascript позволяет, поскольку кто-то изучает язык, вы должны научиться сражаться с хорошей кодировкой практики (simicolons - еще один хороший пример). В случае подъема, как правило, хорошей практикой является объявление ваших переменных в верхней части области, в которой они были бы подняты в любом случае. Как уже упоминалось, строгий режим не является серебряной пулей и не будет обеспечивать это для вас.

+0

Спасибо, я действительно больше формальный программист и предпочитаю старые методы. Я читал, что строгий будет отключать подъем, таким образом, мой тест. Меня просто беспокоило, что подъем не отключился, как говорили другие. –

+0

Я думаю, что путаница, вероятно, происходит из-за того, что, как указывает @Thomas, строгий режим требует, чтобы вы объявили переменную – aw04

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

  • Нет связанных вопросов^_^