2016-10-31 5 views
2

Ich bin neu in Javascript und ich habe ein Problem, das ich nicht lösen kann.Aufruf der Funktion von einer anderen Funktion - Javascript API

Am Anfang hatte ich den folgenden Code, und funktionierte gut

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; 
 
}

nun eine API, und das Problem ist, ich versuche, das zu schaffen, wenn ich var get_a = a.call(get_a); oder var get_a = a();, erhalte ich ein:

Uncaught ReferenceError: a is not defined(…).

ich viele verschiedene Möglichkeiten des Aufrufs eines von b versucht, aber ich bekomme immer einen Fehler. Momentan sieht mein Code so aus. Habt ihr Ideen?

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; 
 
     } 
 
    } 
 
}

+0

Sie werden lernen müssen, um das 'this' Objekt zu verwenden, um diese Funktionen zugreifen - sie sind nicht global deklariert, so dass die Standard-Suche von' Fenster [a] 'resultiert in' undefiniert'. Wenn Sie dies tun, sollten Sie sich die 'Klassen'-Delkaration in JS ansehen, anstatt anonyme Objekte aus Ihren Funktionen zurückzugeben.Schauen Sie sich auch Prototypen an, da Sie auf diese Weise einen neuen Verweis auf eine Funktion _jedesmal_ erstellen, während Sie beim Prototyp nur einmal vorgehen (Klassen sind übrigens nur schicke Prototypen). – somethinghere

Antwort

-1

Try this:

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

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

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

Das war nicht das, was das OP sagte, war das Problem - dieses Bit funktionierte. Du hast den Teil der Frage beantwortet, der _was_ keine Frage war. – somethinghere

0

Wenn Sie mit Ihrem vorhandenen Code fortsetzen wollen, müssen Sie die Zeile var get_a = a();-var get_a = this.a(); ändern.

Der Grund dafür ist, dass Sie angeben möchten, dass die Funktion, auf die Sie verweisen, a innerhalb des Bereichs des übergeordneten Objekts ist. Ohne this zu verwenden, sucht JavaScript standardmäßig im aktuellen Funktionsumfang, was bedeutet, dass es versucht, die Funktion a() innerhalb der b-Funktion zu finden, b : function() { ... }.

Hinweis: Ich habe den Code leicht gereinigt und document.getElementById("images").files durch ein Testfeld ['1', '2', '3'] ersetzt, so dass dieser Code in einer Geige-Einstellung ausgeführt wird. Sie können diese Zeile später auskommentieren und ändern.

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

Sie müssen this verwenden, um das Skript zu sagen, für die Funktion im aktuellen Bereich zu suchen, nicht global:

var get_a = this.a(); 

Als Nebenpunkt, diese Syntax ist ein wenig redundant:

a : function a() { 

Sie brauchen nicht die zweite Erwähnung von "a":

a : function() { 

wird funktionieren.

+2

Nur als Referenz ist es _is_ tatsächlich nützlich, eine benannte Funktion Deklaration zu verwenden, auch wenn es eine Kopie ist - es wird angezeigt, wenn Sie Elemente überprüfen (Ich habe etwas, das Funktionen jedes Frame aufruft und es ist großartig, das Array von Funktionen als aufgelistet zu sehen 'myFunctionName() {}' obwohl es nichts tut. Hilft beim Debuggen, aber das ist es :)) – somethinghere

0

Ihre Objektdefinition ist ein bisschen aus. Hier ist, wie es getan werden sollte:

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();

Verwandte Themen