- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Зачем быть уникальным в мире, где все можно скопировать
Почему так важна уникальность текста и как она влияет на SEO
Ingate Organic
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Это для вас сложно, но всё же рискну 😀
У меня есть модуль для создания обработчиков событий Events. На странице есть элементы у которых есть атрибуты в которых прописаны функции как например onclick(поясню специально, это нестандартные события, например для наблюдения изменения дочерних элементов и др). Модуль событий находит такие элементы и создаёт функции обработчики и вешает на эти элементы. Всё замечательно.
Но когда используются глобальные переменные, например, создал переменную в глобальной области и хочешь её использовать, но она 'is not defined', т.к. при создании функции нужно передавать эти переменные, но мы заранее не знаем какие, поэтому нужен универсальный подход.
Для любителей спрашивать у ИИ скажу, что eval, with, замыкания тут не подходят, нужно именно через new Function, которая в своей области видимости будет видеть глобальные переменные.
ЗЫ. Вот почему я в таких случаях недолюбливаю разработчиков существующих инструментов и ЯП..
Я понимаю вашу задачу - вам нужно создавать функции-обработчики событий для элементов с атрибутами, содержащими код, и при этом обеспечить доступ к глобальным переменным.
Проблема в том, что new Function() создает функцию в глобальной области видимости, но не имеет доступа к переменным из областей видимости, в которых она была создана (кроме глобальных).
Вот вариант решения:
Что делает это решение:
Это позволит вашим динамически создаваемым обработчикам событий иметь доступ к любым глобальным переменным, которые существуют на момент создания функции.
Ничего не понятно на самом деле =) Но если че то не получается, значит не правильный подход и надо делать по другому, а не городить костыли =)
И на счет глобальных переменных, они получается срабатывают после основного кода?
Ничего не понятно на самом деле =) Но если че то не получается, значит не правильный подход и надо делать по другому, а не городить костыли =)
И на счет глобальных переменных, они получается срабатывают после основного кода?
Да, вы правы - если решение слишком сложное, значит подход стоит пересмотреть. Давайте разберемся в ситуации более четко.
По поводу глобальных переменных - они доступны в любой момент после их объявления. Проблема в том, что когда вы создаете функцию через new Function() , она имеет доступ только к глобальной области видимости, но не к локальной области, где была создана.
В примере:
Переменная aa объявлена в глобальной области, но внутри new Function() она не видна, потому что функция, созданная через new Function() , имеет доступ только к глобальному объекту (window в браузере).
Вот более простой подход без костылей:
Главное различие: let aa = 'AAA' создает переменную в текущей области видимости, а window.aa = 'AAA' создает свойство глобального объекта, которое будет доступно внутри функции, созданной через new Function() .
Если хотите проще решить исходную задачу с обработчиками событий, стоит посмотреть в сторону использования системы событий, которая уже решает эту проблему (например, какой-нибудь EventEmitter паттерн).
Я понимаю вашу задачу - вам нужно создавать функции-обработчики событий для элементов с атрибутами, содержащими код, и при этом обеспечить доступ к глобальным переменным.
Проблема в том, что new Function() создает функцию в глобальной области видимости, но не имеет доступа к переменным из областей видимости, в которых она была создана (кроме глобальных).
Я неправильно в первом сообщении написал задачу. Там я намного всё упростил, чтобы попонятнее, но вышло наоборот. Пример выше рабочий. У меня же немного иначе это происходит через промисы, примерно так:
Опять же я тут всё сильно упростил. Смысл в том, что у меня в начале, в хедере страницы стоит загрузчик модулей, запускается скрипт и загружает указанные модули создав промис. В конце страницы пользовательские скрипты, которые запускаются в этом промисе после того как страница и все JS модули загружены.
Так вот нужен доступ к переменным промиса при new Function в модуле событий. Опять же мы не можем передавать переменные по цепочке промиса и в модули, т.к. заранее не знаем какие будут вообще переменные.
Я неправильно в первом сообщении написал задачу. Там я намного всё упростил, чтобы попонятнее, но вышло наоборот. Пример выше рабочий. У меня же немного иначе это происходит через промисы, примерно так:
Опять же я тут всё сильно упростил. Смысл в том, что у меня в начале, в хедере страницы стоит загрузчик модулей, запускается скрипт и загружает указанные модули создав промис. В конце страницы пользовательские скрипты, которые запускаются в этом промисе после того как страница и все JS модули загружены.
Так вот нужен доступ к переменным промиса при new Function в модуле событий. Опять же мы не можем передавать переменные по цепочке промиса и в модули, т.к. заранее не знаем какие будут вообще переменные.
Теперь я лучше понимаю вашу задачу. Проблема в том, что переменные, объявленные внутри Promise (как aa в вашем примере), находятся в замкнутой области видимости этого Promise и недоступны для функций, создаваемых через new Function() позже.
В JavaScript существует фундаментальное ограничение: функции, созданные через new Function() , имеют доступ только к глобальной области видимости (например, window в браузере), но не к локальным переменным или замыканиям.
Вот несколько возможных подходов к решению:
2. Передавать контекст в виде объекта в обработчики:
3. Использовать паттерн "Внедрение зависимостей" для ваших модулей:
Ключевое здесь: вместо того, чтобы пытаться передать переменные в функцию напрямую, мы передаем объект контекста, который содержит все нужные переменные.
Это более чистый подход с архитектурной точки зрения, чем использование глобальных переменных.
Это всё не то.. по моему вы пользуетесь ИИ
Если вам нужно, чтобы динамически созданная функция через new Function() имела доступ к переменным из области видимости промиса, то это действительно фундаментальное ограничение JavaScript - функции, созданные через new Function() , видят только глобальную область видимости.
Возможно, стоит пересмотреть архитектуру вашего решения в целом. Может быть, более подходящим будет подход, где обработчики событий используют другие механизмы, например:
Без более детального понимания вашей системы и требований трудно предложить оптимальное решение.
Это всё не то.. по моему вы пользуетесь ИИ
Да ладноо..., как ты догадался?😂
Вы бы пример конкретный привели, из вашего ТЗ ваще ничего непонятно =)
Так ТС сам не понимает, что хочет, уже полгода. Его грязными тряпками выкинули с кибера, но общения хочется - сюда пришел.
У любой задачи есть бизнес-ценность. То есть - какой результат будет в результате решения задачи.
Любая задача должна быть понятно описана. Тогда ее можно решить.
В данном случае нет ничего. Что улучшит решение этой проблемы по сравнению с существующими? Ничего
Описание понятное - отсутствует. Если возникает задача сложная для нее рисуют ся диаграммы, описывается существующая ситуация, описывается желаемый результат.
То есть - страничка сайта, где есть проблема и что должно получиться после решения.
А гадать, что там в голове у ТС - нет ни желания не времени. Тем более ему уже массу вариантов предлагали решения.