1

我有一个非常大的 javascript 文件:超过 9,000 行。代码如下所示:

var GlobalVar1 = "";
var GlobalVar2 = null;

function A() {...}

function B(SomeParameter) {...}

我正在使用谷歌编译器,全局变量和函数被重命名为 a,b,c... 并且有一个很好的变化,以后可能会与一些外部代码发生冲突。

我想要做的是像 jquery 库一样组织我的代码,其中所有内容都可以通过 $ 访问。有没有办法给我的代码命名,例如,一切都在 # 字符后面。

我想让这个来调用我的代码:

#.GlobalVar
#.functionA(SomeParameter)

我怎样才能做到这一点?

4

5 回答 5

3

旁注:该#字符不是有效的变量名(请参阅此问题)。常见的“速记”是下划线_和美元$。我记得读到美元的使用意味着机器生成的代码,但这在很大程度上被忽视了,正如你在 jQuery 中看到的那样。

最熟悉的技术是这样的:

(function($) {
  $.a = function() { ... }
  $.b = 1000;
})(myNamespace);

myNamespace.a( ... );

无论哪种方式,我认为您必须在代码中对某个变量进行分配。

或者,您可以指定类似类的内容:

function MyClass() {
  var f = 0;

  function a() { return f; }
  function b(value) { f = value; }
  function c() { f *= f; }

  this.get = a;
  this.set = b;
  this.square = c;
}

var myInstance = new MyClass();
于 2012-04-11T23:36:19.890 回答
3

您必须将所有库包装在一个闭包中以保护您的局部变量。您希望全局访问的成员应该分配给全局上下文对象(在浏览器中是window)。

(function(){
  var GlobalVar1 = "";
  var GlobalVar2 = null;

  function A() {...}

  function B(SomeParameter) {...}

  //  some function accessible globally with `window.C()` or just `C()`:
  window.C = function() {}
})();
于 2012-04-11T23:39:01.760 回答
2
var $$ = {
    A: function() {
        alert('namespace rules!');
    },
    B: function() {
        alert('foo');
    }
}
$$.A();
$$.B();
​

现场演示

​​​​​​​​​​​​​​​​等等...

请注意,我从更改为#$$因为#变量名称非法。

于 2012-04-11T23:27:42.447 回答
1
var # = {
    GlobalVar1: "",
    GlobalVar2: null,

    A: function() {

    },

    B: function(SomeParameter) {

    }
}
于 2012-04-11T23:30:47.083 回答
1

另一种方法——如果你已经在使用 Closure Compiler——是使用它的特性来处理命名空间。

例子:

mylib.js

goog.provide('mynamespace.whatever');

var globalVar1='foo';

mynamespace.whatever.functionA=function(txt){
    alert('A: '+txt+' '+globalVar1);
};

mynamespace.whatever.functionB=function(){
    alert('B: '+txt+' '+globalVar1);
};

主.js

goog.require('mynamespace.whatever');

mynamespace.whatever.functionA('hello world');


如果你想在编译后的代码之外使用未混淆的函数/变量,你可以使用:

goog.exportProperty(object, publicName, symbol)

goog.exportSymbol(publicPath, object, opt_objectToExportTo)

看看:http ://closure-library.googlecode.com/svn/docs/closure_goog_base.js.html

于 2012-04-12T00:03:58.503 回答