Используйте функцию, завернутую в IIFE js-скрипта A внутри IIFE js-скрипта B без глобального воздействия

#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. О, я думал, вы хотите сделать его доступным в глобальной области под окном