2012-06-05 2 views
2

У меня есть Sublimelinter, установленный в Sublime Text 2, и это здорово. Однако это не так, как следующий код:Неправильно ли объявлять переменную внутри оператора if в Javascript?

if(condition){ 
    var result = 1; 
}else{ 
    var result = 2; 
} 
process(result); 

Это говорит для var result = 2;, что результат уже определен и process(result);, что он используется вне области видимости. Это просто спутать с {} КРП заявления для более закрытой сферы или не должен я действительно делать это так:

var result; 
if(condition){ 
    result = 1; 
}else{ 
    result = 2; 
} 
process(result); 
+0

Я не буду оспаривать другие ответы, но я думаю, что это плохая привычка находиться. Семантика 'var' несколько странная в JavaScript, и они только становятся более странными, когда у вас есть условный код, например что. – Pointy

+1

http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting – jasssonpet

+0

Отлично читаю @jasssonpet – Jake

ответ

5

Нет, это не «неправильно»; он будет поднят до вершины ближайшего определения функции, согласно спецификации ECMAScript.

Да, ваша программа «Sublimelinter» неверна, чтобы заявить, что переменная выходит за рамки.

+0

Спасибо, это то, что я хотел подтвердить. Я думаю, что предпочитаю, как читается второй пример. – Jake

2

Неплохо. Если вы получите эту ошибку, вы определили result ранее в своем коде.

Вы можете также упростить условия для этого, так что вы не должны использовать результат:

process(condition ? 1 : 2); 
+0

Мне нужно научиться писать быстрее. ;-) – Oliver

+0

Я раньше не определял 'результат' - это только мой текстовый редактор, который ошибочно принимает блоки, если оператор if для закрытой области. – Jake

+0

Мне нравится ваше решение с тройным оператором, но я спрашиваю больше о концептуальном уровне, примеры упрощены. – Jake

0

JavaScript не имеет блок сферы. Переменные привязаны к функции, в которой они определены, что означает, что когда вы объявляете переменную внутри блока if, она «поднимается» вверху функции.

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

Я бы сказал, что ваш код не является «неправильным», но вводит в заблуждение людей, читающих код, которые не знакомы с тем, как область действия работает в JavaScript. Я бы выбрал вторую версию, потому что она фактически отражает то, как выполняется код.

Here's a good article пояснение переменной подъем.

0

Объявите свой указатель var один раз с помощью функции, в которой у вас есть оператор if. Как и ninjagecko, все vars отправляются на вершину их содержащих функций.

Однако; будьте осторожны, потому что если вы объявите тот же var дважды, как у вас, он сбросит var.

0

Я рекомендую делать это:

var result = MORE_LIKELY_OUTCOME; 

if (LESS_LIKELY_CONDITION) { 
    result = LESS_LIKELY_OUTCOME; 
} 

process(result); 

Таким образом, вы настраиваете результат сначала к тому, что вы ожидаете, что это будет большую часть времени. Затем оператор if изменит результат, если возникнет условие.

1

Javascript не имеет «блокировки», как и многие другие языки. Если это так, переменная result не существовала бы при попытке вызвать process(result), потому что было бы невозможно ссылаться на нее вне блока {}, где она была определена.

Однако, javascript имеет функцию scoping, где переменные в одной функции не могут быть доступны другой функцией. Если переменные объявлены в функции, они не имеют никакого значения, потому что они все равно будут доступны из любой точки внутри этой функции (без области блока).Следовательно, оба фрагмента кода, которые вы опубликовали, эквивалентны тому, что интерпретатор запускает код.

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

0

Оказалось, что SublimeLinter использует JSHint, который может подавить это предупреждение и объясняет, почему он существует.


funcscope Эта опция подавляет предупреждения об объявлении переменных внутри управляющих структур при обращении к ним позже из снаружи. Несмотря на то, что JavaScript имеет только две реальные области - глобальную и - такая практика приводит к путанице среди людей, новичков в языке и трудно отлаживаемых ошибках. Таким образом, по умолчанию JSHint предупреждает о переменных, которые используются вне их предполагаемой области видимости.

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