访问封装的匿名函数

时间:2018-11-22 15:36:10

标签: javascript

我有这个代码

(function(data){
    this.init=function(){
        console.log("Hello world");
    };
    this.init();
});

我想从外部代码调用匿名函数,而无需自我执行。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您必须将匿名函数归因于变量才能获得对它的引用,然后才能像下面的代码那样调用它:

var myFunc = (function(data){...})

但是,假设您无法控制要尝试使用的javascript,则必须评估MDN在this chapter中描述的代码,并构建先前的表达式。

  

严谨的编码做法:我要提出的这种做法根本不是一种好习惯,在运行时评估javascript代码不是很好,除非非常必要,否则应避免。话虽如此,但您仍然认为您需要这样做,请按照下面的说明进行操作(并适合自己)。

首先,您必须对JavaScript文件进行HTTP请求并获取其内容。然后,您可以创建一个表达式并对其求值,就像下面提供从请求(myCodeFromHttpRequest)获得的代码一样。

eval('var myFunc = ' + myCodeFromHttpRequest);
myFunc();

这样,您可以以某种方式模拟如果可以控制代码,将要执行的操作。

但是,正如MDN所建议的那样,使用eval是一种不好的做法,您可以将其评估为一个函数,这样它将创建一个隔离的作用域,从而防止javascript对新变量进行全局检查并阻止您的代码在正在运行的程序上添加新代码段时,在全局范围内注入不安全的垃圾。

var myFunc = Function('return ' + myCodeFromHttpRequest)();
myFunc();

这基本上是创建一个function来返回您的匿名函数并自行执行以产生值并将其分配给myFunc变量。

您最终的解决方案是这样的:

  

如果您不支持$.ajax,则可以使用fetch或其他HTTP客户端

fetch('my-script.js').then(async(res) => {

    var myCodeFromHttpRequest = await res.text();
    var myFunc = Function('return ' + myCodeFromHttpRequest)()

    myFunc();
});

工作片段:

// fetch('my-script.js').then(async(res) => {

    var myCodeFromHttpRequest = //await res.text();
      // mocked code in order to simulate the request
      '(function(data){' +
      '    this.init=function(){' +
      '        console.log("Hello world");' +
      '    };' +
      '    this.init();' +
      '});';
    
    var myFunc = Function('return ' + myCodeFromHttpRequest)()

    myFunc();
//});