考虑以下:

function windowTest() { }

(function () {
    function test() { }

    var test1 = new test(); // Works fine.
    var test2 = new window["windowTest"](); // Works since windowsTest is declared globally.
    var test3 = new window["test"]();  // Fails since in an IIFE.

    // How can I create a testObj if I only have the string "test"?
})();


基本上,我想创建一个其功能在IIFE中声明的对象。

最佳答案

原因

var test3 = new window["test"]();


失败是因为未全局声明test。如您所知,如果您想访问直接在IIFE中声明的项目,则可以按名称访问它们。

new test();


另一种方法是将函数存储在某种对象内,然后像使用window一样访问该对象。这几乎总是解决此类问题的方法。



(function() {
  var context = {
    test: function() {
      console.log('new test');
    }
  };

  var test = new context['test']();
})();





最后一种方法使用evaleval几乎总是a really bad idea.确实,除非您只是出于兴趣而滥用该语言,否则应避免使用它。但是您可以在这种情况下使用它。



(function() {
  function test() {
    console.log('new test');
  }

  var test = eval('new test()');
})();

关于javascript - 从IIFE动态调用构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41902540/

10-11 12:58