В моем стремлении написать чистый Javascript-код в качестве новичка, я недавно читал эту статью об именах в JavaScript, когда я наткнулся на этот параграф:
Код в самой верхней части следующего примера демонстрирует различные способы, которыми вы можете проверить, чтобы проверить, существует ли переменная (пространство имен объектов) уже до ее определения. Обычно вы увидите разработчиков, использующих вариант 1, однако варианты 3 и 5 можно считать более тщательными, а вариант 4 считается хорошей передовой практикой.
// This doesn't check for existence of 'myApplication' in // the global namespace. Bad practice as you can easily // clobber an existing variable/namespace with the same name var myApplication = {}; /* The following options *do* check for variable/namespace existence. If already defined, we use that instance, otherwise we assign a new object literal to myApplication. Option 1: var myApplication = myApplication || {}; Option 2 if(!MyApplication) MyApplication = {}; Option 3: var myApplication = myApplication = myApplication || {} Option 4: myApplication || (myApplication = {}); Option 5: var myApplication = myApplication === undefined ? {} : myApplication; */
Вариант 1, безусловно, тот, который я видел большую часть времени, и я это хорошо понимаю.
Вариант 2 в порядке, но, кажется, не хватает var myApplication
заранее или if(!window.myApplication)
иначе если myApplication
не входит в глобальную область, условие if(!myApplication)
вызовет ошибку, не так ли?
Вариант 3 - тот, с которым у меня возникают проблемы: я понимаю, что myApplication = myApplication
выполняется myApplication = myApplication
, а myApplication
в глобальной области (из-за var
в начале). Моя проблема в том, что я не могу придумать случай, когда этот вариант делает что-то большее, чем вариант 1.
Вариант 4 в моих глазах был бы лучше написанным window.myApplication || (myApplication = {})
window.myApplication || (myApplication = {})
чтобы избежать ошибки, если myApplication
не находится в глобальной области.
Вариант 5 исключает значения false-y, отличные от undefined
но это хорошая идея? Если myApplication
- пустая строка, остальная часть кода, скорее всего, потерпит неудачу, не так ли?
Кто-нибудь сможет пролить свет на различия между различными вариантами и, в частности, объяснить, почему вариант 3 описывается как более тщательный?