При тестировании на наличие переменной вы никогда не должны слепо проверить это имя переменных. Эти же кольца истинны при поиске свойств и методов глубоко вложенных объектов.
Имея это в виду:
// error will occur if someObj has not ever been defined in your code.
if (someObj) {
// someObj has been defined
}
Вы можете обойти это и использовать минимальный код при тестировании против глобального масштаба, который в браузерах это уровень окна.
// safe way to test for global variable.
if (window.someObj) {
// someObj has been defined
}
Другой прекрасный тест для глобальной переменной будет с помощью встроенного метода TYPEOF, однако это становится немного утомительно типа, если вам нужно сделать, это достаточно часто.
// another safe method for testing a global variable
if (typeof someObj != "undefined") {
// someObj has been defined
}
Теперь для тестирования глубоких вложенных объектов (часто используется в качестве псевдо-пространств имен в JS).
// testing deep nested object
if (self.someObj &&
someObj.something &&
someObj.something.foo &&
someObj.something.foo.bar) {
// do something ...
}
всего два окончательных быстрых заметок для продвинутых кодеров:
Иногда в IE, я заметил, что делает этот тип поиска теста/существование фактически называется методом, если я испытывал к нему. например:
// this is an example, I can't recall which actual methods did this off-hand
if (document.execCommand) {
// resultant value of execCommand method gets used to pass/fail the conditional
}
И, наконец, очень мягкий побочный эффект такого типа существования поиска в том, что когда у вас есть поглотитель примененного к собственности, она будет реально работать сорбент во время условного тестирования.
// this code only runs in Firefox 2+
// and is provided for instructional purposes only
var foo = {
get bar() { alert("bar getter was executed") }
};
if (foo.bar) {
// a foo.bar property is defined
}
Это хорошо, если вы знаете, что someObj был определен первым. –
Разве это не первое, что он проверяет? –
Если someObj не был определен, вы получите сообщение об ошибке для попытки доступа к этой переменной. Если вы предисловите его окном || self scope вы устраняете эту проблему, и по мере того, как вы выполняете поиск, как будто вы второе условие. –