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

时间:2016-10-31 15:47:44

标签: javascript api-design

我是javascript的新手,我遇到了一个无法解决的问题。

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

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

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

function b(){
    var get_a = a.call(get_a);
    return get_a;
}

现在我正在尝试创建一个API,问题是当我执行var get_a = a.call(get_a);var get_a = a();时,我会得到一个:

  

未捕获的ReferenceError:a未定义(...)。

我尝试了许多不同的方法来调用from b,但我总是遇到错误。目前我的代码看起来像这样。你们有什么想法吗?

function foo(){
    var new_api = new my_api();
    var load_b = new Array();
    load_b = new_api.b();
}

var my_api = function(){
    return {
        a : function a() {
            var files = document.getElementById("images").files;
            return files;
        },
        b : function b() {
            var get_a = a();
            return get_a; 
        }
    }
}

4 个答案:

答案 0 :(得分:2)

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

var get_a = this.a();

作为次要观点,这种语法有点多余:

a : function a() {

你不需要第二次提到“a”:

a : function() {

会奏效。

答案 1 :(得分:0)

如果您想继续使用现有代码,则必须将行var get_a = a();更改为var get_a = this.a();

原因是你要指定你所引用的函数a在父对象的范围内。在不使用this的情况下,JavaScript默认查看当前函数范围,这意味着它正在尝试在a()函数b中找到b : function() { ... }函数。

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

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

答案 2 :(得分:0)

你的对象定义有点偏。以下是应该如何做的:

function foo() {
  var new_api = new my_api();
  var load_b = new_api.b();
  console.log(load_b);
}

var my_api = function() {
  this.a = function() {
    return "the files"; // document.getElementById("images").files;
  };
  this.b = function() {
    return this.a(); // use this.a to make sure we access local a
  };
  // return the object with a and b both set as functions:
  return this;
}

foo();

答案 3 :(得分:-1)

试试这个:

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

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

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