2009-02-24 2 views
10

Этот фрагмент кода приводит к ошибке во время выполнения JavaScript: (foo не определен)Использование неопределенных переменных, если-заявления

if (foo) { 
    // ... 
} 

Я должен определить foo первый, например, так:

var foo = foo || null // or undefined, 0, etc. 

... И только тогда я могу сделать:

if (foo) { 
    // ... 
} 

Почему?


Update:

Это было несколько из brainfart на моей стороне вещей: «fcourse вы не можете получить доступ к переменной, которая не выделяется.

Забавные вещи, которые вы можете сделать typeof() по неопределенной переменной you. Я собираюсь принять ответ miccet, так как я думаю, что это самое элегантное решение.

+0

[Это] (http://2ality.com/2013/04/check-undefined.html) 2ality статья упоминает разные рекомендуемое способы проверки _undefined_, включая интерпретацию его как _falsy_ в булевых контекстах. – martieva

ответ

11

Вам нужно будет определить его, чтобы иметь возможность проверить его на значение. В этом случае вы проверяете погоду, это правда. Эта переменная, очевидно, не настроена на что-либо вообще, то же самое, что и значение null в C# и Nothing в VB.

Если вы должны, вопросы отладки или любой другой, вы можете проверить, если переменная не определена следующим образом:

if (typeof(variable) == "undefined") 
+0

Красивый маленький фрагмент. Очень элегантно. Это будет иметь в виду. Странно, что вы можете сделать typeof() для неопределенной переменной, но не: if (undefinedVariable! == null). – roosteronacid

+1

Да, я нашел это достаточно удобным. Я думаю, причина в том, что вы смотрите _at_, а не _into_, если это имеет смысл. – miccet

+0

+1 Это то, что я собирался предложить. – cletus

1

Это было бы, потому что вы теперь его определения с:

var foo = foo || null 

Почему бы вам не определить его в первую очередь? Это кажется мне довольно простым (если только я что-то не хватает).

Использование переменной до ее создания (или установки чего-либо) является плохой практикой программирования, и ее следует избегать. Мой совет: не использовать этот трюк, чтобы убедиться, что он настроен на что-то, но выследить логическую ошибку и исправить ее.

0

Мне кажется странным вопросом для меня. Позволяет сказать, что я хотел бы назвать функцию: -

вещь();

Если вещь не определена нигде, я бы ожидал, что она потерпит неудачу.

Почему вы ожидаете использовать переменную foo без определения ее в любом месте вашего кода?

18

Я чувствую, что вы спрашиваете, потому что вы знаете, что javascript, по-видимому, допускает неопределенные переменные в некоторых ситуациях (т. Е. Ошибки времени выполнения), а не в других.

Рассуждение выглядит следующим образом: JavaScript всегда выдает ошибку проверки неопределенных переменных, но никогда выдает ошибки при проверке не определено свойства, до тех пор, как вы используете только один уровень косвенности.

Пример:

// throws runtime error 
if(foo) { 
    // ... 
} 

// does not throw runtime error 
if(window.foo) { 
    // ... 
} 

// does not throw runtime error 
var obj = {}; 
if(obj.foo) { 
    // ... 
} 

// throws runtime error 
if(obj.foo.bar) { // going two levels deep, but foo is undefined 
    // ... 
} 

Надежда, что очищает его немного.

+1

Спасибо, что очистили это. – roosteronacid

0

Я нахожу это немного странным вопросом. Для того, чтобы ответить на него, я думаю, что лучше, чтобы задать вопрос наоборот ...

Что бы ожидаемый результат

if (foo) { 
    // ... 
} 

где Foo не определен в качестве переменной?

Я думаю, что единственный возможный ответ: if всегда будет оценивать значение false, и вы никогда не выполнили этот блок.

Задавая более прямой вопрос, почему вы ожидаете, что код будет работать, который относится к переменным, которые не существуют и не имеют назначенных значений? Что такое foo в контексте, который вы определили выше?

Суть в том, что без декларации последующее утверждение не имеет никакого значения. foo - это не термин, который можно оценить самостоятельно, поэтому вам нужно предоставить интерпретатору контекст для ссылки на foo, чтобы он мог его оценить.

Есть языки, которые автоматически создают переменные для вас, когда они впервые назначены (python и VB разделяют этот опасный признак), но даже они не смогут оценить переменную до назначения, поэтому интерпретаторы бросают ошибки.

Если у вас компилятор было бы рассказал вам об этом тоже ...

0

Это не странный вопрос сог я на той же лодке: р

я достичь здесь после того, как "прибегая к помощи javascript use variable undefined ". Я запутался, я видел где-то, что люди могут просто использовать неопределенную переменную в цикле.

Может быть, я видел его на другом языке


Я нашел его. Первые коды успешно выполняются во время второй ошибки времени выполнения кода.

Первые коды:

test(); 
function test() { x = 4; } 
console.log(x); //this produce 4 

Второй коды:

test(); 
function test() { x[0] = 1; } 
console.log(x[0]); 
Смежные вопросы