#javascript #scope #anonymous-function #iife
#язык JavaScript #масштаб #анонимная функция #я живу
Вопрос:
Приватизация функций переменных довольно важна в текущем проекте js, который я разрабатываю. Следствием этого является то, что каждый сценарий заключает свое содержимое в IIFE. Сейчас мне интересно, чтобы сделать еще один шаг вперед, действительно ли возможно в js, используя import
операторы или аналогичные, сделать следующее:
// contents of script A (function(){ function secretFunction() { } }());
// contents of script B (function(){ // var AsFunction = // secretFunction of script A; // AsFunction(); }());
Не раскрываясь secretFunction()
в глобальном масштабе (что я делал до сих пор, чтобы достичь того, чего я хочу) .. ?
Моя мысль состояла в том, чтобы просто иметь возможность использовать функции различных сценариев друг в друге, не подвергая их воздействию глобальной области, поэтому «риск» их изменения из внешнего источника еще больше снижается. Таким образом, мне не нужно было бы присоединять функции secretFunction()
к глобальной области, чтобы сделать их доступными в других сценариях; следовательно, я мог бы использовать функции из других областей IIFE в других областях IIFE. Возможно ли что-то подобное в js?
Комментарии:
1. Модули раскрывают только то, что вы явно указываете им раскрывать
export
. Если вы не экспортируетеsecretFunction
, он никогда не будет виден за пределами модуля. Более того, импорт из модуля не затрагивает глобальную область. Шаблон модуля IIFE устарел вместе с реальными модулями.2. Я пройдусь по документам модуля js, но все же, не может ли кто-нибудь теоретически обновить / изменить ваши функции
export
и привести к тому, что вы используетеimport
не то, что изначально планировали?3. Кроме того, в [документах]() говорится, что модули «… должны быть элементами верхнего уровня; например, вы не можете использовать экспорт внутри функции.» Итак, могу ли я на самом деле экспортировать функции из IIFE? В противном случае я в любом случае выставил бы их на всеобщее обозрение, чего я хочу избежать..
4. » Итак, могу ли я на самом деле экспортировать функции из IIFE? В противном случае я бы в любом случае предоставил им глобальную область, чего я хочу избежать «. пожалуйста, перечитайте мой первый комментарий, потому что я обращаюсь ко всему этому-модули делают IIFE устаревшими, а модули ничего не предоставляют глобальной области, и они ничего не предоставляют, не раскрывая явно.
5. Ничего себе, сумасшедший, просмотрел некоторые документы по логике модуля js, и теперь я понимаю, что вы имеете в виду. Эта концепция модулей на самом деле также делает концепцию сеттеров и геттеров гораздо более надежной в js, поскольку вам не нужно передавать геттеры и сеттеры глобальному объекту, что делает их уязвимыми для любых изменений. По крайней мере, это то, что я понял. Очень жаль, что я не знал об этом до разработки всего этого фреймворка js :’)
Ответ №1:
Так что на всякий случай, если кто — то столкнулся с этой проблемой, и вы оказались в той же ситуации, что и я: вы разработали целую js — структуру для бизнеса, основанную на IIFE
структуре, и было бы интересно изменить все это на логику js-modular, но у вас нет на это времени.
В этом случае вы также можете использовать подход, который предоставляет вашей функции глобальную область для передачи ее из сценария A в сценарий B, в то время как любые изменения, применяемые к этой функции в глобальной области, тем не менее, все равно не повлияют на функцию, когда вы используете ее в сценарии B. Рассмотрим следующий пример, чтобы четко понять, что я имею в виду:
СОДЕРЖАНИЕ СЦЕНАРИЯ А
(function(){ window.sample = {}; window.sample.test = function(){ console.log("initial"); }; }()); window.sample.test(); // This will log "initial"
СОДЕРЖАНИЕ СЦЕНАРИЯ B
(function(){ // Make a copy of the function of script A passed via global scope var copy = window.sample.test; copy(); // This will log "initial" // Modify the global function passed to this script window.sample.test = function(){ console.log("modified"); }; window.sample.test(); // This will log "modified" copy(); // This will still log "initial", although the global function, which is // the source of this copy, has been modified. The variable copy remains // unaffected by this, because the variable stores the value to what it is // assigned, as js always passes variables by value and not by reference. }());
Комментарии:
1. Пожалуйста, не делайте этого или, по крайней мере, поместите его под какой-нибудь глобальный ключ в окне,
2. Моя цель состоит в том, чтобы сделать содержимое сценария B недоступным в глобальной области, поэтому это будет делать противоположное тому, что мне нужно.
3. О, я думал, вы хотите сделать его доступным в глобальной области под окном