Javascript IIEF - если невозможно получить доступ к какой-либо переменной, то почему я могу получить к ней доступ через функцию? - PullRequest
0 голосов
/ 20 марта 2020

Я так много читал об этой топике c, но мне все еще неясно ...

Если IIFE все о конфиденциальности (// + не загрязняет глобальное пространство имен ... // ) тогда почему я могу получить доступ к переменной IIFE, используя аргумент функции? В результате будет показано 1200.

Так что нет, я знаю, что «а» - это 200, поэтому я получил к нему доступ. Что за логика c за этим стоит? Почему я могу получить доступ к этой переменной, если все говорят, что я не могу?

(sum=function(b){
  var a= 200;
  return a+b;

})();
console.log(sum(1000)); //1200 
console.log(a); //error as expected

Часть 2: если IIEF пропал после его вызова, то почему я могу выполнить его столько раз, сколько я sh?

(sum=function(){

  console.log("random text");

})();

sum(); /*this can relaunch the function even "iief is only used once" + I can do that multiple times
sum(); //'random text' 'random text' ...

часть 3:

Почему я могу перезапустить фрагмент, когда я даю имя IIEF? Я везде читал, что IIFE используется только один раз ... как только они запускаются, и они ушли ..

(function sum(){

  console.log("random text");

})();

sum(); //I can execute the IIEF as many times as I wish however I shouldn't be able to

Ответы [ 2 ]

1 голос
/ 20 марта 2020

У вас там нет IIFE.

Код между ( и ) назначает функцию неявно глобальной переменной sum.

Затем () после этого выполняет результат вычисления выражения (которое является той же самой функцией).

0 голосов
/ 20 марта 2020

Ваш пример кода явно не объявляет sum как переменную, поэтому он неявно глобален . По сути, ваш код интерпретируется так, как если бы он был на глобальном уровне в сценарии:

var sum = function(b) {
  var a = 200;
  return a+b;
};
sum();
console.log(sum(1000));

Обычно целью IIFE является создание пространства имен, которое в конечном итоге может быть аккуратно экспортировано в ограниченное число ( надеюсь 1) глобальных символов. Внутри частного пространства имен функции все виды структур данных и функций могут быть объявлены и со временем манипулированы, полностью изолированы от другого кода.

Я думаю, что ключевой ошибкой в ​​вашем коде является предположение, что это необходимо сохранить анонимную функцию где-нибудь. По моему опыту, это не обычное дело; обычно это выглядит так:

(function(args) {
  // code, possibly a whole lot
})(parameters);
...