Javascript 使用动态函数调用创建JS库
我正在创建一个JS“library”文件,但我想将其整体封装在一个对象中,以避免污染包含该文件的页面的名称空间 这是在库中的一个函数中,我需要按名称调用库中的其他函数,例如使用Javascript 使用动态函数调用创建JS库,javascript,Javascript,我正在创建一个JS“library”文件,但我想将其整体封装在一个对象中,以避免污染包含该文件的页面的名称空间 这是在库中的一个函数中,我需要按名称调用库中的其他函数,例如使用window[] 下面的代码只是一个示例,实际上有几百个函数可以通过名称调用。这是由问题引起的,因为我无法让window[]引用函数,正确的方法是什么 我在主机页中尝试了以下方法: <script src= "mylib.js"></script> var oMyLib = new cMyLib(
window[]
下面的代码只是一个示例,实际上有几百个函数可以通过名称调用。这是由问题引起的,因为我无法让window[]
引用函数,正确的方法是什么
我在主机页中尝试了以下方法:
<script src= "mylib.js"></script>
var oMyLib = new cMyLib(); //there will only ever be one 'instance' of this
只要函数在父范围内,您就可以直接引用它,即
function someFunc(that) {
anotherFunc1();
};
这很简单
另一件事是,实现这一点的经典方法是将所有内容封装在一个自调用匿名函数中,即
(function() {
function anotherFunc1() {};
function anotherFunc2() {};
this.cMyLib = function() { ... };
})();
但你的方法也很好
如果希望通过动态名称调用函数,则可以将其存储在顶级对象中:
(function() {
var my_functions = {
anotherFunc1: function() {},
anotherFunc2: function() {}
};
this.cMyLib = function() {
var name = 'anotherFunc1';
my_functions[name]();
};
})();
这就像创建一个孤立的“全局”范围
旁注:不要使用
eval
。这是非常不安全和缓慢的。它会在某个时候对您产生反作用。您希望通过名称(或者根据您的评论,实际上是通过数字)引用的函数应该是该对象的一部分,并且不能通过窗口访问,例如:
function cMyLib() {
// allow call without new
if (! (this instanceof cMyLib)) {
return new cMyLib();
}
// enforce singleton
if (this.constructor.singleton) {
return this.constructor.singleton;
} else {
Object.defineProperty(this.constructor, 'singleton', {
value: this
});
}
// instruction array (no need to expose via `this`)
var insn = [];
insn[0x4c] = function lda_immediate() { ... }
// instruction execution
this.step = function() {
var opcode = memory[pc++];
if (opcode in insn) {
// `.call` ensures `this` is set inside the instruction fn.
insn[opcode].call(this);
} else {
hcf();
}
}
}
请注意顶部的额外内容-方便代码,以确保只有一个cMyLib
。只有全局函数显示为窗口的属性,您不想这样做(因为这会污染名称空间)。为什么你认为你需要像那样调用window['anotherFunc1']
。它用于处理器模拟器,因此函数用于直接等同于数字的指令..你不能给一个函数一个只有数字的名称,但你可以这样做this.insns={};这个.insns[0x4c]=函数lda(…)
hmm,也许我应该移植我的6809模拟器。。。哦,是的,数组[]
比对象{}
更有意义。谢谢Alnitak,insns是一个数组,我正期待着这个。insns=[]。我想你应该把这个作为回答,这样我就可以接受了!非常感谢,问题是我不能直接引用函数,因为会有几百个函数。它用于处理器仿真器,每个指令都有一个函数。eval很诱人me@martinc我不明白你的问题。即使有数百万,那又怎样?只要函数在父范围内,就可以引用它。如果你想动态引用它(比如通过动态生成的名称),那么把它们放在一个对象/字典中。谢谢这是一个很好的信息和另一种方式,我必须选择一个被接受的答案!
function cMyLib() {
// allow call without new
if (! (this instanceof cMyLib)) {
return new cMyLib();
}
// enforce singleton
if (this.constructor.singleton) {
return this.constructor.singleton;
} else {
Object.defineProperty(this.constructor, 'singleton', {
value: this
});
}
// instruction array (no need to expose via `this`)
var insn = [];
insn[0x4c] = function lda_immediate() { ... }
// instruction execution
this.step = function() {
var opcode = memory[pc++];
if (opcode in insn) {
// `.call` ensures `this` is set inside the instruction fn.
insn[opcode].call(this);
} else {
hcf();
}
}
}