Почему подчеркивание _.isUndefined(variable) дает ошибку, что переменная не определена?

В Chrome я получаю «Uncaught ReferenceError: targetNode не определен» из этой строки кода console.log(_.isUndefined(targetNode));.

Я получаю ту же ошибку, когда делаю console.log(targetNode === void(0)); и console.log(targetNode);.

typeof targetNode === "undefined" возвращает true, как и ожидалось, но я понимаю, что сравнение с void(0) более эффективно.

Я могу обойти это, установив значение по умолчанию для targetNode, или я могу просто использовать typeof targetNode === "undefined", но я пытаюсь понять, почему проверка на то, является ли переменная неопределенной, захлебнется, если переменная не определена.


person Jami    schedule 29.01.2013    source источник


Ответы (1)


Когда вы запрашиваете targetNode, он ищет локальную переменную, а затем в последующих родительских областях, пока не достигнет конца цепочки. Если он все еще не нашел его, есть ошибка.

typeof отличается тем, что работает аналогично try..catch при получении переменной и возврате "undefined" в улове. Неродной код (например, isUndefined) не может этого сделать, поскольку переменная должна быть разрешена, чтобы передать ее функции.

Однако, если символ определен, он может быть правильно передан. Например:

function test(param) {
    console.log(_.isUndefined(param));
}
test("argument");
test(); // undefined argument

Или другой пример:

function test() {
    console.log(_.isUndefined(foo)); // true, no error due to hoisting
    var foo = 3;
    console.log(_.isUndefined(foo)); // false, foo is defined now.
}

Вы также можете указать явный источник, например window.targetNode. window определено, поэтому скрипт знает, где искать, однако свойство targetNode может быть не определено, и в этом случае вы получите undefined.

person Niet the Dark Absol    schedule 29.01.2013
comment
На самом деле ошибка X не определена вводит в заблуждение. Лучше бы сделали Х не существует или что-то подобное. В основном все, что не использует слово определено - person Niet the Dark Absol; 30.01.2013
comment
Возможно, вы не объявили X в этой области... Еще раз спасибо. - person Jami; 30.01.2013