4

我有一个具有以下 JavaScript 文件结构的 rails 应用程序:

- assests/javascripts
  - /application
    - module1.js
        .
        .
        .
    - moduleN.js
  - application.js

每个文件如下所示:

var module1 = (function(){

    //Lots of code

    return {
        //Public stuff
    }

})();

模块需要相互访问,因此会暴露一些东西。

应用程序.js

//= require_tree ./application

我想知道是否有办法将所有代码编译成匿名函数;就像是:

(function(){
//= require_tree ./application
})();

这显然行不通。我目前正在做的是:

应用程序.js

//= require ./begin.js
//= require_tree ./application
//= require ./end.js

begin.js是 just(function(){end.js})();.

不是最整洁的解决方案。

这不仅消除了全局变量,而且允许编译器将它们的名称更改为更短的名称,以获得更轻量级的代码和更不可读。我关心代码机密性,不想公开模块名称,使逆向工程更加困难。

4

1 回答 1

1

使用全局命名空间。

应用程序.js

//= require_self
//= require_tree ./application

App = {};

require_self在这里很重要,因为默认情况下 Sprockets 将此文件的内容放在底部。

应用程序/first_module.js

App.FirstModule = (function () {
  //blah blah

  return {
    //public methods
  }
})();

您试图做的是滥用匿名功能,并且有点违背目的。如果您需要在两个模块之间共享私有变量,它们应该是一个模块。如果模块太大而无法维护,则需要将其分解为具有公共接口的单独模块。

于 2013-04-09T01:45:06.823 回答