IIFE方法泄漏?

时间:2019-05-21 09:30:08

标签: javascript iife

可能是一个简单的问题,希望不要重复类似like this one的问题,但是是否有任何规则如何为任何浏览器,node.js等正确编写 IIFE ? /> IIFE示例-第二个是我自己在IE中的实验过程中创建的,观看了所有相关的Pluralsight视频之后。
是否有规则,最佳实践或规范说明如何在IIFE中正确编写方法?
在第一个例子(很常见)中,除了构造函数外,其他所有内容都泄漏了 第二,不是,但不确定为什么或在何处找到此行为的说明

经典函数和其匿名版本之间(事件处理程序等)也可能有所不同。
https://coderwall.com/p/ta4caw/using-iife-to-create-private-members-in-javascript
true-构造函数
假-吸气剂
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 个答案:

答案 0 :(得分:1)

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;
})();

答案 1 :(得分:1)

您是否缺少实例变量?

如果您在IFFE中使用this.variable名称,它将创建实例公共变量,但是只能使用私有静态或公共实例变体。