命名空间类似jQuery的大型javascript
我有一个非常大的javascript文件:超过9000行。代码如下所示:命名空间类似jQuery的大型javascript,javascript,jquery,Javascript,Jquery,我有一个非常大的javascript文件:超过9000行。代码如下所示: var GlobalVar1 = ""; var GlobalVar2 = null; function A() {...} function B(SomeParameter) {...} (function($) { $.a = function() { ... } $.b = 1000; })(myNamespace); myNamespace.a( ... ); 我正在使用google编译器,全局变
var GlobalVar1 = "";
var GlobalVar2 = null;
function A() {...}
function B(SomeParameter) {...}
(function($) {
$.a = function() { ... }
$.b = 1000;
})(myNamespace);
myNamespace.a( ... );
我正在使用google编译器,全局变量和函数被重命名为a,b,c。。。还有一个很好的变化,就是以后可能会与一些外部代码发生冲突
我想做的是让我的代码像jquery库一样组织起来,在这里所有的东西都可以通过$访问。有没有一种方法可以给我的代码命名,使所有内容都隐藏在一个#字符后面
我想让它调用我的代码:
#.GlobalVar
#.functionA(SomeParameter)
我该怎么做
var $$ = {
A: function() {
alert('namespace rules!');
},
B: function() {
alert('foo');
}
}
$$.A();
$$.B();
等等
请注意,我从#
更改为$
,因为#
在非法toke中用于变量名
var # = {
GlobalVar1: "",
GlobalVar2: null,
A: function() {
},
B: function(SomeParameter) {
}
}
等等
请注意,我从#
更改为$
,因为#
在非法tok中用于变量名。旁注:#
字符不是有效的变量名(请参阅)。常见的“速记”是下划线\uu
和美元$
。我记得读到过,美元的使用是为了机器生成的代码,但这在很大程度上被忽略了,正如您在jQuery中看到的那样
var # = {
GlobalVar1: "",
GlobalVar2: null,
A: function() {
},
B: function(SomeParameter) {
}
}
最常见的技术如下所示:
var GlobalVar1 = "";
var GlobalVar2 = null;
function A() {...}
function B(SomeParameter) {...}
(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();
旁注:#
字符不是有效的变量名(请参阅)。常见的“速记”是下划线\uu
和美元$
。我记得读到过,美元的使用是为了机器生成的代码,但这在很大程度上被忽略了,正如您在jQuery中看到的那样
最常见的技术如下所示:
var GlobalVar1 = "";
var GlobalVar2 = null;
function A() {...}
function B(SomeParameter) {...}
(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();
您必须将所有库包装在一个闭包中,以保护您的局部变量。要全局访问的成员应指定给全局上下文对象(在浏览器中是
窗口
)
您必须将所有库包装在一个闭包中,以保护您的局部变量。要全局访问的成员应指定给全局上下文对象(在浏览器中是
窗口
)
如果您已经在使用闭包编译器,另一种方法是使用它的特性来处理名称空间 例如: 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);
};
goog.require('mynamespace.whatever');
mynamespace.whatever.functionA('hello world');
main.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);
};
goog.require('mynamespace.whatever');
mynamespace.whatever.functionA('hello world');
如果要在编译代码之外使用未模糊的函数/变量,可以使用:
goog.exportProperty(object, publicName, symbol)
及
看看:如果您已经在使用闭包编译器,另一种方法是使用它的特性来处理名称空间 例如: 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);
};
goog.require('mynamespace.whatever');
mynamespace.whatever.functionA('hello world');
main.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);
};
goog.require('mynamespace.whatever');
mynamespace.whatever.functionA('hello world');
如果要在编译代码之外使用未模糊的函数/变量,可以使用:
goog.exportProperty(object, publicName, symbol)
及
请查看:
#
在javascript标识符名称中不是有效字符。对于“名称空间”,请查看模块模式。全局变量转换为局部变量SE并通过闭包访问。“名称空间”之外应该可用的其他变量和函数作为单个全局对象的属性保存。但是,您可以使用$和u,它们都是有效字符(链接问题更普遍适用)
在javascript标识符名称中不是有效字符。对于“名称空间”,请查看模块模式。全局变量转换为局部变量SE并通过闭包访问。“名称空间”之外应该可用的其他变量和函数作为单个全局对象的属性保存。但是,您可以使用$和u,它们都是@Thilo的有效字符(链接问题更普遍适用)的副本。这是一个例子。。。但我编辑,只为你…:-)好的,然后在我的代码中,我不写functo(SomeParameter),而是通过写$.A调用函数,如果我想访问当前的全局变量,我写$.MyGlobal=3;而不是MyGlobal=3?如果#不好,美元已经被拿走,那么有什么好的选择?是@或%还是&更好?@frenchie。那$$
呢?顺便说一下,您可以调用命名空间frenchie
,它比它更酷,然后$
..)@Thio你的意思是什么?jQuery不在乎Prototype.js在采用$character时已经普及了它的使用。尽管我同意这是一个错误的选择,因为它没有提供任何关于它的含义的信息。@Thilo。这是一个例子。。。但我编辑,只为你…:-)好的,然后在我的代码中,我不写functo(SomeParameter),而是通过写$.A调用函数,如果我想访问当前的全局变量,我写$.MyGlobal=3;而不是MyGlobal=3?如果#不好,美元已经被拿走,那么有什么好的选择?是@或%还是&更好?@frenchie。那$$
呢?顺便说一句,您可以调用名称空间frenchie
,这比$
酷多了……)@Thio你的意思是什么?jQuery不在乎Prototype.js在采用$character时已经普及了它的使用。虽然我同意这是一个错误的选择,因为它没有提供任何关于它意味着什么的信息;您还可以执行函数测试(){}var foo=new Test();$字符用于ECMA-262第3版中机器生成的代码。我认为Prototype.js是第一个在标识符中推广使用它的人(可能是为了模仿原作者更熟悉的其他语言中的变量名)。jQuery从那里借用了它。$character是inten