从另一个函数调用函数-Javascript API

从另一个函数调用函数-Javascript API,javascript,api-design,Javascript,Api Design,我是javascript新手,我有一个无法解决的问题 开始时,我有以下代码,并且工作得很好 函数foo(){ var load_b=新数组(); 加载_b=b(); } 函数a(){ var files=document.getElementById(“图像”).files; 归还文件; } 函数b(){ var get_a=a.call(get_a); 返回get_a; }试试这个: var a = function() { return document.getElementByI

我是javascript新手,我有一个无法解决的问题

开始时,我有以下代码,并且工作得很好

函数foo(){
var load_b=新数组();
加载_b=b();
}
函数a(){
var files=document.getElementById(“图像”).files;
归还文件;
}
函数b(){
var get_a=a.call(get_a);
返回get_a;
}
试试这个:

var a = function() {
    return document.getElementById("images").files;;
};

var b = function() {
    return a() || [];
};

var foo = function() {
    var load_b = b();
};

如果要继续使用现有代码,必须更改行
var get_a=a()
to
var get_a=this.a()

这样做的原因是您希望指定所引用的函数
a
在父对象的范围内。在不使用
this
的情况下,默认情况下,JavaScript会在当前函数作用域中查找它,这意味着它试图在
b
函数中找到
a()
函数,
b:function(){…}

注意:我稍微清理了一下代码,并用测试数组
['1','2','3']
替换了
document.getElementById(“images”).files
,以便此代码在小提琴设置中运行。您可以取消注释,稍后再更改该行

function foo() {
    var new_api = new my_api();
    var load_b = new_api.b();
    alert(load_b); // I added this here so this code outputs in a fiddle
}

var my_api = function() {
    return {
        a : function() {
            var files = ['1', '2', '3']; //document.getElementById("images").files;
            return files;
        },
        b : function() {
            var get_a = this.a();
            return get_a; 
        }
    }
}

foo(); // I added this here so this code executes in a fiddle

您需要使用
this
告诉脚本在当前范围内查找函数,而不是全局查找:

var get_a = this.a();
其次,这种语法有点多余:

a : function a() {
你不需要第二次提到“a”:


将起作用。

您的对象定义有点不正确。以下是应该如何做到这一点:

函数foo(){
var new_api=new my_api();
var load_b=new_api.b();
控制台日志(加载);
}
var my_api=函数(){
this.a=函数(){
返回“thefiles”;//document.getElementById(“images”).files;
};
this.b=函数(){
返回此.a();//使用此.a确保访问本地a
};
//返回a和b都设置为函数的对象:
归还这个;
}

foo()
您必须学会使用
this
对象来访问这些函数-它们不是全局声明的,因此
窗口[a]
的标准查找会导致
未定义的
。执行此操作时,您可能希望查看JS中的
class
delcaration,而不是从函数返回匿名对象。同样也要研究原型,因为这样你每次都在创建一个新的函数引用,而使用原型你只做一次(顺便说一句,类只是更奇特的原型)。这不是OP所说的问题——这一点是有效的。您回答了问题的一部分,这不是一个问题。仅供参考,使用命名函数声明实际上很有用,即使它是一个副本-它将在您检查元素时显示(我有一些东西每帧调用函数,很高兴看到列为
myFunctionName(){}的函数数组
即使它什么也不做。有助于调试,但仅此而已:)
a : function() {