Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用动态函数调用创建JS库_Javascript - Fatal编程技术网

Javascript 使用动态函数调用创建JS库

Javascript 使用动态函数调用创建JS库,javascript,Javascript,我正在创建一个JS“library”文件,但我想将其整体封装在一个对象中,以避免污染包含该文件的页面的名称空间 这是在库中的一个函数中,我需要按名称调用库中的其他函数,例如使用window[] 下面的代码只是一个示例,实际上有几百个函数可以通过名称调用。这是由问题引起的,因为我无法让window[]引用函数,正确的方法是什么 我在主机页中尝试了以下方法: <script src= "mylib.js"></script> var oMyLib = new cMyLib(

我正在创建一个JS“library”文件,但我想将其整体封装在一个对象中,以避免污染包含该文件的页面的名称空间

这是在库中的一个函数中,我需要按名称调用库中的其他函数,例如使用
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();
        }
    }
}