IIFE методы утечки? - PullRequest
       17

IIFE методы утечки?

0 голосов
/ 21 мая 2019

Вероятно, простой вопрос, надеюсь, не дублировать даже немного похожий , как этот , но есть ли какое-либо правило, как правильно написать IIFEs для любого браузера, node.js и т. Д.
Примеры IIFE - второй мой, созданный во время экспериментов в IE после просмотра, вероятно, всех связанных видео Pluralsight.
Есть ли какое-либо правило, передовой опыт или спецификация, как правильно писать методы в IIFE?
В 1-м (довольно распространенном) примере просачивается все, кроме конструктора
Во 2-м нет, но не уверен, почему или где найти характеристики этого поведения .
Вероятно, существуют различия между классическими функциями и их анонимными версиями (обработчики событий и т. Д.).
Собака (https://coderwall.com/p/ta4caw/using-iife-to-create-private-members-in-javascript)
true - конструктор
false - getter
false - установщик уникален в каждом случае

Диаграмма
true - конструктор
true - метод имеет один экземпляр во всех объектах

var Dog = (function() {
  var name = "defaut name";
  var DogInner = function() {
    this.getName = function() {
      return name;
    };
    this.setName = function(value) {
      name = value;
    };
  };
  return DogInner;
})(); // this does the trick
var results = ["Dog"]
var dog = new Dog();
var dog1 = new Dog();
results.push(dog.Dog === dog1.Dog); // true
results.push(dog.setName === dog1.setName); // false
results.push(dog.setName === dog1.setName); // false

// IIFE object picked from my code
var Chart = (function() {

  function Chart() {}

  Chart.prototype.drawChart = function(data) {}

  return Chart;
})();
results.push(' ');

results.push("Chart");
var chart1 = new Chart();
var chart2 = new Chart();
results.push(chart1.Chart === chart2.Chart); // true
results.push(chart1.drawChart === chart2.drawChart); // true

console.log(results.join('\n'));

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Вам не хватает переменных экземпляра?

Если вы используете имя this.variable в вашем IFFE, оно создаст открытую переменную экземпляра, но возможны только частные варианты статического или открытого экземпляра.

1 голос
/ 06 июня 2019

Правильно было и то, что VS Code распознал эту версию, совместимую со старой школой, как класс ES2015:

'use strict';
 var Utils = (function() {

    function Utils() {}

    function GetUrl(data) {
    }
    Utils.prototype.GetRequest = async function(data) {
        const response = await rp(GetUrl(data));
        return response;
    }

    return Utils;
})();

Преобразуется в аналогичный, менее совместимый, но более читаемый:

'use strict';
 var Utils = (function() {

    class Utils {
        constructor() { }
        async GetRequest(data) {
            const response = await rp(GetUrl(data));
            return response;
        }
    }

    function GetUrl(data) {
    }

    return Utils;
})();
...