|
Модераторы: Sardar, Aliance |
|
YahоО |
|
||||
Бывалый Профиль Группа: Участник Сообщений: 198 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
Разбираю найденный код, и появился такой вопрос:
Почему (зачем) в скрипте внутри функции объявляется переменная, и дальше используется window. чтобы она была видна вне анонимной функции :
вместо того чтобы сразу, т.е. еще до выполнения анонимной функции объявить нужную (эту же) переменную и не использовать window для присвоения ей значения?
Так понимаю что сам на этот вопрос ответа не найду :( Может мне просто так удобнее как во втором варианте? Это сообщение отредактировал(а) YahоО - 9.1.2020, 17:18 |
||||
|
|||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Так, на вскидку - переменая `Fakt` имеет глобальную область видимости. Так и должно быть, или это просто опечатка?
По сути - код разбит на 2 части - описание и инициализация. Обычно, обе части располагаются в разных местах страницы сайта. К примеру инициализация счетчика яндекса и скрипт, в котором он описан. Это объясняется особенностями броузерного кэширования. Инициализация вставляется в том месте, которое будет удобнее редактировать, например в тег script выдаваемой html. Так что разделить 2 части на 3 это не очень хорошая идея, в перспективе Если в данном случае отдельной инициализации не требуется и отдельной видимой снаружи переменой возможно и не нужно - кто мешает инициировать все это добро прямо в описании ?
Это сообщение отредактировал(а) ksnk - 9.1.2020, 13:20 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
YahоО |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 198 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
ksnk, спасибо за отклик! Еще вчера понял что не все там правильно записал в своем вопросе-примере, не то чтобы опечатка, а даже ошибка там была, но тем не менее Вы все верно прочитали.
Подредактировал свой пример. Код разбит на 2 части - описание и инициализация, это понятно, можно даже в анонимной функции инициализировать:
но мой вопрос о другом, попробую его еще раз как то переписать по другому, может и сам его пойму: зачем нам window.fakt если можно иметь var fakt; это разве одно и тоже? И если есть разница, то чем она заключается? |
|||
|
||||
YahоО |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 198 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
В javascript скорость выполнения функций как то не особо зависит от того объявлена ли переменная, или ее используют без объявления сразу присваивая ей значение (замеров не делал, но и не было необходимости такой),
но все четко заметно в excel vba, где разница во времени просто ощутима, примерно как одна секунда и много много секунд для одних и тех же действий с одними и теми же данными. Понятно что в этом вопросе javascript более шустрый, но непонятно в чем смысл и какая то разница все же должна быть, если мы объявим переменную var то как это отражается на window, и если просто использовать window.fakt |
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Использовать глобально видимую во всем приложении переменную можно, когда обработчики событий вставляются прямо в верстке. Например где-то в шаблоне сайта забито что-то вроде <div ... onclick="return fact.dosomething();'...;
если таких вставок в шаблонах или использование еще в каких местах не предполагается, то использовать глобальную область видимости не нужно и даже вредно. На скорость выполнения область видимости не влияет, практически, но если какой-то скрипт тоже захочет использовать глобальную переменную с таким же именем - будет много интересной отладки на вполне, вроде бы, работающем коде... Замыкание тут используется для того, чтобы такого геморроя на ровном месте было поменьше. Разница var fakt и window.fakt в том, что не обязательно глобальная область видимости может называться window. Для броузерных скриптов - да, обычно это так, но если скрипт подтягивается аяксом или вставлен в какой-нибудь обрамляющее замыкание, как делают минимизаторы, то возможны разные варианты. imho, лучше window.fakt Это сообщение отредактировал(а) ksnk - 9.1.2020, 18:43 -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
YahоО |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 198 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
"Использовать глобально видимую во всем приложении переменную можно, когда обработчики событий вставляются прямо в верстке. Например где-то в шаблоне сайта забито что-то вроде <div ... onclick="return fact.dosomething();'...;
если таких вставок в шаблонах или использование еще в каких местах не предполагается, то использовать глобальную область видимости не нужно и даже вредно. " Но ведь fakt и есть в данном случае глобально видимая во всем приложении переменная. По любому. То ли как var fakt , то ли как window.fakt . Использовать глобальную область видимости не нужно и даже вредно - да как же это????? куда же девать этот самый fakt ? он уже в этой видимости, глобальной. Чтобы убрать его оттуда придется вообще весь код упрятать анонимку?! В "учебнике" читаю: Все переменные, объявленные вне функций, попадают в глобальную область видимости. Переменная, инициализированная без ключевого слова var, также имеет в глобальную область видимости. Другими словами все варианты использования в приведенном примере переменной fakt обязательно попадают в глобальную область видимости. Если скрипт подтягивается аяксом / fetch и / или вставлен через new Function / eval то и здесь те же "правила", потому что новые имена переменных появляются внутри new Function / eval и являются локальными, а чтобы они не были локальными их надо объявлять отдельно, в корне а не во вставке. Не обязательно глобальная область видимости может называться window - нууу есть глобальная локальная и блочная область видимости, о других не слышал, но как бы глобальная всегда window ? Это я так понимаю, а как на самом деле кто знает, может и так всё. Лучше так, или так, думал что как лучше где то должно быть написано, оказывается если специально не написали в мануалах об этом, то наверно совсем не интересный мой вопрос, а значит и не нужный, а хотелось что б уж совсем совсем совсем "правильно" |
|||
|
||||
ksnk |
|
|||
прохожий Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 84 Всего: 386 |
Глобальные переменные лучше не использовать. Просто потому что их можно в любом месте грязными руками поменять и получить неожиданный и плохо уловимый глюк. С большой вероятностью - ты сам через пару месяцев, когда этот код уже забудется и нужно будет вставить подобную штуку на этот же сайт. Привычка к названиям переменных остается Если можно без особо страшного геморроя выкинуть глобальность этой переменной - то так и нужно сделать. Если в коде уж очень серьезные закладки на глобальность - на уровне вставок в шаблоне или других скриптах, то да, не получится так просто, энергетически выгоднее наплевать и оставить глобальной... В node.js , например, объекта window нет. Есть объект global. Так как язык один и тот же, иногда появляется желание получить код работающий в обоих местах. -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
YahоО |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 198 Регистрация: 11.6.2015 Репутация: 1 Всего: 1 |
Объект global он же тоже где то находится? В глобальной видимости, т.е. в window? хотя возможно к window там обращений как таковых может и нет.
ksnk, еще раз благодарю за разъяснения, простите если отнял понапрасну Ваше время и внимание, поскольку вопрос мой не оказался полезным для практического его использования. |
|||
|
||||
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |