从IIFE动态调用构造函数

时间:2017-01-27 20:32:01

标签: javascript iife

请考虑以下事项:

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中声明其功能的对象。

3 个答案:

答案 0 :(得分:2)

原因

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

答案 1 :(得分:1)

您可以使用this

(function () {
    this.test = function () {}
    console.log(this["test"]())
})()

或者,使用单独的变量:

(function () {
    var foobar = {
      test: function () { }
    };
    console.log(foobar["test"]())
})();

答案 2 :(得分:1)

您可以将您的功能绑定到此:

function(){
 //your code using
 this.test("Hi");
 this["test"]("Hi");
}.call({
 //function declarations:
 test:window.alert,
});

仍然是一个IIFE因此它不会在全球范围内工作:

this.test("Hi");//reference Error