Чтобы на самом деле ответить на ваш вопрос, ПОЧЕМУ это происходит - прошло чуть более двух лет и месяц: D - это из-за подъема переменной .
По существу, перед выполнением кода в глобальной области видимости или внутри функции есть фаза, где код сканируется для всех объявлений var
и function
(не путать с выражениями выражений , но это другая история).
Все эти переменные и функции затем объявляются внутри текущей области, и только после этого код фактически выполняется.
Это происходит независимо от их положения в коде, с областями, соответствующими телам функций, а не блокам операторов. И что делает это еще более нелогичным, даже если вы установите начальное значение для переменных в их объявлениях, они будут оставаться «пустыми», пока объявление не будет достигнуто снова в нормальном потоке выполнения .
Поэтому, когда вы пишете:
if(!embed_BackgroundColor) {
var embed_BackgroundColor;
embed_BackgroundColor = "#F4F4F4";
}
что на самом деле происходит так:
Код сканируется для объявлений var
. embed_BackgroundColor
объявляется внутри этой области независимо от того, было ли оно уже объявлено или нет. Его начальное значение не определено.
Начинается выполнение кода. Оператор if
выполняется. Переменная объявлена , но ее значение не определено, поэтому условие истинно. Использование typeof
не поможет вам различить необъявленную и объявленную, но еще не установленную переменную. В любом случае это не имеет значения.
Декларация var
достигается нормальным потоком кода. Если бы вы дали переменной начальное значение, она была бы установлена сейчас. В этом случае ничего не происходит.
embed_BackgroundColor
устанавливается на значение "#F4F4F4"
.
Итак, суть в следующем: вы можете использовать typeof variable == 'undefined'
, как видно из других ответов, или даже просто '! Variable', как вы изначально использовали, но не используйте var
, иначе это все испортит.