javascript – 如何使用字符串引用闭包,就像使用成员函数而不使用eval一样?

我们在许多文件中分解了一些js代码.我们有一个核心文件,用于定义许多其他js文件使用的代码.

目前我们有这样的事情:

core.js:

window.mycore = function() {

    var myfunction1 = function() {
    };
    var myfunction2 = function() {
    };
    var myfunction3 = function() {
        //..
        var a =  myfunction1(b);
        //..        
    };
    //...
    // many "myfunction"
    //...
    var myfunctionN = function() {
    };
    var publish = function() {
        for(var i = 0; i < arguments.length; i++) {
            try {
                window.mycore[arguments[i]] = eval('(' + arguments[i] + ')');
            }
            catch(e) {
                Log.err(600, arguments[i], e);
            }
        }
    };
    publish("myfunction1", "myfunction7", "myfunction8",/*...*/"myfunctionM")
}

app.js:

// ...
// ...
var result = window.core.myfunction1("myparam");
// ...
// ...

请注意,没有核心方法被声明为window.core对象的成员.相反,它们通过发布功能附加到核心对象.

这有一些优点:

>核心代码可以引用任何核心功能,而无需编写“window.core”.
>我们避免在每个公共函数声明中编写“var myfunction = window.mycore.myfunction = function()…”
>暴露的方法可以看作是中心化的.

但是,在使用代码分析工具时,在发布函数中使用eval会给我们带来问题,因为他们不倾向于理解eval声明.

所以,这是我的问题.
哪个是改进此代码的更好方法,因此我们可以保留所提到的优点,但根除eval声明.
我知道向发布函数发送一些名称/值对的解决方案,如publish({‘myfunction1’:myfunction1},…),但我也想避免函数名重复.
考虑到我不是在寻找激进的变化,因为已经编写了很多代码.

谢谢!

最佳答案 我不确定我完全理解你使用“发布”方法的原因,但是有没有理由你不只是从构造函数中返回一个具有正确函数的对象?

即:

window.mycore = (function() {
   var myFunc1 = function(a) {
      alert(a);
   };

   var myFunc2 = function(b) {
      // call to other function in the same scope
      myFunc1(b);
   }

   ...

   // at the end just expose the public members you want
   return {
      myFunc1: myFunc1,
      myFunc2: myFunc2
   };
})();

要么

window.mycore = (function() {
   return {
      myFunc1: function(a) {
         alert(a);
      },
      myFunc2: function(b) {
         this.myFunc1(b);
      }
   };
})();

或者,另一种方式来结束相同的对象:) …一如既往有不同的方式来达到目的

(function(){

    var o = {};

    o.func1 = function(a) {
        alert(a);
    }

    o.func2 = function(b) {
        this.func1(b);
    }

    window.mycore = o;

})();
点赞