29.05.2015, 06:37
|
|
Профессор
|
|
Регистрация: 25.01.2015
Сообщений: 163
|
|
Как сделать чтобы функция не создавалась
Объясните пожалуйста почему в консоли 1 и как сделать чтобы функция не создавалась?
if(false){
function a(){console.log('1')}
}
a()
|
|
29.05.2015, 07:59
|
|
Профессор
|
|
Регистрация: 22.05.2015
Сообщений: 384
|
|
а вы уверены что в консоли "1" ?
PS: можно юзать анонимные функции
if(false){
(function(){
alert('1');
})();
};
alert(a()); // алерт для наглядности, чтобы не смотреть в консоль
Последний раз редактировалось KosBeg, 29.05.2015 в 08:05.
|
|
29.05.2015, 08:27
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,228
|
|
Сообщение от AntonMs
|
как сделать чтобы функция не создавалась?
|
Таки не объявлять ее...
if(false){
a=function(){alert('1')};
};
|
|
29.05.2015, 11:21
|
Аспирант
|
|
Регистрация: 26.05.2015
Сообщений: 43
|
|
Сообщение от AntonMs
|
почему
|
Это баг by design. Компиляция осуществляется за 2 прохода, в первом проходе function declarations какбы вытаскиваются наружу, не глядя на окружение. Это может вести к куче трудноуловимых ошибок, указанная Вами -- далеко не единственная. Причем, разные движки могут вести себя по-рзному. Поэтому, лучше их вообще избегать. пишите всегда а=function(){}.
|
|
29.05.2015, 11:31
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
|
|
29.05.2015, 11:35
|
Аспирант
|
|
Регистрация: 26.05.2015
Сообщений: 43
|
|
tsigel,
ИЧСХ, статья, указанная Вами начинается с бреда:
Цитата:
|
В JavaScript функция является значением, таким же как строка или число.
|
Для справки: В js функция является объктом.
Кстати, это не функциональное выражение, а декларация.
И в той части, которая обсуждается, нет никакого противоречия с вашей бульварной статейкой
Цитата:
|
Основное отличие между ними: функции, объявленные как Function Declaration, создаются интерпретатором до выполнения кода.
|
Вы хоть читайте для приличия, на что ссылаетесь.
Последний раз редактировалось indeterm, 29.05.2015 в 11:39.
|
|
29.05.2015, 11:44
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
indeterm,
да, функция объект. не спорю, но статья по крайней мере отражает стандарты спецификации, а вы пишете бред, потому как каждый движок может интерпретировать код по свойму (в 1, 2 или 100 проходов как угодно), лишь бы поведение кода соответствовало стандартам, и все движки отрабатывают в соответствии со стандартами. Так что ваши "куче трудноуловимых ошибок" - либо незнание стандарта, либо не понимание как работает javascript.
|
|
29.05.2015, 12:03
|
Аспирант
|
|
Регистрация: 26.05.2015
Сообщений: 43
|
|
Сообщение от tsigel
|
потому как каждый движок может интерпретировать код по свойму
|
Я как раз об этом сказал. Вы ударились в демагогию, не хочу продолжать. Суть моего поста в том, что выражения всегда интерпретируются однозначно, а интерпретация деклраций зависит от погоды на марсе, в основном (в том числе, от вольной интерпретации стндарта и оригинального понимания семантики производителями движков)
Последний раз редактировалось indeterm, 29.05.2015 в 12:06.
|
|
29.05.2015, 12:10
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
Сообщение от indeterm
|
а интерпретация деклраций зависит от погоды на марсе
|
Именно этот кусок мне и не понравился потому как это не так. Эти выражения работают всегда одинаково, именно об этом я и писал. Что не важно как движок читает код, важно как он отрабатывает, а отрабатывает он по стандартам и всегда одинаково.
|
|
29.05.2015, 12:14
|
Аспирант
|
|
Регистрация: 26.05.2015
Сообщений: 43
|
|
Сообщение от tsigel
|
Именно этот кусок мне и не понравился потому как это не так. Эти выражения работают всегда одинаково,
|
А мне не нравится, что Вы рассуждаете о том, о чем не имеете представления. Запустите код тса в FF и убейтесь апстену удивитесь.
|
|
|
|