Сделать возвратные переменные IIFE только для некоторых других IIFES - PullRequest
0 голосов
/ 12 ноября 2018

Мне было интересно, можем ли мы объявить переменную в одном IIFE и вернуть ее, но сделать ее доступной для другого конкретного IIFE? Вот пример!

Итак, у меня есть

const iife1 = (()=>{
const x = 10;
return x
})()

const iife2 = (()=>{/* MAKE X AVAILABLE ONLY IN THIS FUNCTION */})()
const iife3 = (()=>{/* HERE X CANNOT BE CALLED */})()

Возможно, вы бы просто сказали не передавать переменную x в iif3 в качестве аргумента, но мне было интересно, есть ли условный способ, которым мы можем достичь этого при возврате переменной из iif1, чтобы iif1 знал, для каких функций он возвращает свои свойства или методы, прежде чем на самом деле вернулся!

Моя цель - создать IIFE, в котором я объявлю все переменные, которые я собираюсь использовать в своем проекте. Затем для каждой переменной я хочу иметь надлежащее условие, чтобы, когда IIFE с переменными возвращал функцию, уже было решено, в какой области будут отправлены переменные для использования! Я не знаю, имеет ли этот подход смысл, но, как всегда говорят, я стараюсь не заполнять глобальный охват.

Codepen

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Нет необходимости использовать три IIFE, помните, что как только ваше значение iife1 вернется, это значение будет в той же области, что и iife2 и iife3, таким образом, вы не достигнете своей цели.

Лучше всего объявить iife2 и iife3 как обычные функции и вызывать их внутри iife1, когда выполняются некоторые условия, и передать переменную, которая создаст область действия iife3 в качестве аргумента.

это решение более гибкое и предсказуемое, чем опора на внешнюю область применения

const fn2 = function(x) {/* MAKE X AVAILABLE ONLY IN THIS FUNCTION */};
const fn3 = function() {/* HERE X CANNOT BE CALLED */};


(()=>{
  const x = 10;

  //your logic

  fn2(x);

  fn3();

})()
0 голосов
/ 12 ноября 2018

Один из (вероятно, десятка) способов добиться этого - использовать Proxy.Сначала IIFE создаст прокси-объект, через который вы получите доступ к его свойствам.Позвонив по номеру revoke(), вы больше не сможете получить доступ к любому из реквизитов прокси.

Как отмечали люди в своих комментариях, вероятно, есть гораздо более простые способы для достижения желаемого результата, ноВы не представили реальную проблему ясно.

const { proxy, revoke } = (() => {
    const x = { test: 'test' };
    const revocable = Proxy.revocable(x, {
        get: (target, name) => name
    });

    return revocable;
})();

const test1 = (proxy => {
    console.log('TEST 1', proxy.test);
})(proxy);

revoke();

const test2 = (proxy => {
    console.log('TEST 2', proxy.test); // can't access
})(proxy);

Fiddle: https://jsfiddle.net/ay92L1r6/6/

0 голосов
/ 12 ноября 2018

IIFE s может использовать только Global, Passed или внутренние переменные.Вы не можете сделать что-то доступным для области функций, которая недоступна для второй функции в той же области.

Передача переменных - это один из способов, но, возможно, в некоторых случаях более практичным способом будет просто вкладывать ваши IIFE по мере необходимости

const iife2 = (() => {
  const iife1 = (() => {
    const x = 10;
    return x
  })()

  console.log(iife1);
/*iife2 scope*/
})()

const iife3 = (() => { /* HERE X CANNOT BE CALLED */ })()
...