2016-08-08 10 views
-1

Meine Funktion verhält sich nicht wie erwartet, und ich versuche festzustellen, ob dies daran liegt, dass ich den Umfang falsch verstanden habe.Kann ich auf eine Funktion in einer Funktion im übergeordneten Raum verweisen?

Die folgende Funktion durchsucht ein Array namens dataLayer, um festzustellen, ob eines der Objekte eine eventAction-Eigenschaft aufweist, die mit einer Zeichenfolge übereinstimmt.

Die Idee ist, dass, wenn ich keinen passenden Wert finden kann, dann drücken Sie einen Wert in dataLayer Array, sonst nichts tun.

Ich habe eine Funktion, die eine andere Funktion referenziert. getNegativeErrs() Referenzen getByValue().

Was wäre der geeignete Weg, um es zum Laufen zu bringen? Wie kann ich getByValue() anderen Funktionen zur Verfügung stellen?

Code:

var errors = [ 
    'Your password must be at least 6 characters long.', 
    'Please enter a valid email address.' 
    ]; 

    getNegativeErrs(errors); 

    function getNegativeErrs(ers) { 
    for(i in errors) { 
     var errobj = getByValue(dataLayer, errors[i]); //updated based on comments 
     if(!errobj) { // if errobj is undefined continue. errobj is undefined when it should have a value so getByValue() not working as expected 
     dataLayer.push({ 
      'event': 'negative_errors', 
      'unseen': errors[i] 
     }) 
     } 
    } 
    } 

    function getByValue(arr, value) { 
    for (var j=0, jLen=arr.length; j<jLen; j++) { 
     if (arr[j].eventAction == value) return arr[j]; 
    } 
    } 
+2

Ich sehe kein Problem Bereich. Was lässt dich denken, dass es einen gibt? Sind diese Funktionen in verschiedenen Dateien? Oder verschiedene Skripte in der gleichen Datei? –

+0

Hmm. Vielleicht stimmt da etwas nicht. Wenn ich Umstände erstelle, wo errobj einen Wert (ein Objekt) haben sollte, zeigt die Konsole es als undefiniert an. Also funktioniert getByValue() nicht wie erwartet. Die Sache ist, es funktioniert, wenn ich in der Konsole außerhalb der Funktion teste. : -/ –

+0

Wenn dies Ihr gesamter Code ist, fehlt Ihnen die Variable 'dataLayer', daher wird die Funktion nicht korrekt ausgeführt. – Dekel

Antwort

0

Wenn das der Umfang des Codes ist, ist getByValue() im globalen Bereich und sollte erreichbar sein.

Wenn dies der Fall ist, sieht es so aus, als ob dies möglicherweise nicht funktioniert, da dataLayers nicht definiert ist.

http://jsbin.com/bivepitafe/

Beachten Sie auch, dass getNegativeErrors() nicht mit dem ers Parameter an sie übergeben, aber die errors Variable, die auch im globalen Bereich ist.

function getNegativeErrs(ers) { 
    for(i in errors) { 
3

ist das zweite Argument zu getByValue soll eine Zeichenfolge oder eine ganze Zahl sein? Momentan ist es eine Ganzzahl, die der Index des errors Arrays ist, das Sie durchlaufen. Ihre Schleife aufruft getByValue wie folgt aus:

getByValue(dataLayer, 0) 
getByValue(dataLayer, 1) 

Wenn Sie meinen, im Wert zu übergeben und nicht den Index, getByValue(dataLayer, i) zu getByValue(dataLayer, errors[i]) ändern.

+0

Ja, das ist ein weiterer Fehler in meinem Code, danke für den Hinweis. Mein ursprüngliches Problem bleibt jedoch. Wird in Kürze einen Link posten –

0

Es gibt ein Problem mit der Funktion getNegativeErrs, Sie verwenden nicht das Argument, das Sie in es übergeben haben. es sollte auch

function getNegativeErrs(ers) { 
     for(i in ers) { 
    var errobj = getByValue(dataLayer, ers[i]); //updated based on comments 
    if(!errobj) { // if errobj is undefined continue. errobj is undefined when it should have a value so getByValue() not working as expected 
    dataLayer.push({ 
     'event': 'negative_errors', 
     'unseen': ers[i] 
    }); 
    } 
    } 
} 

wie diese aussehen, werden Sie können sich die dataLayer Array für Fehler der Schlüssel eventAction aber dann in der obigen Funktion passend Sie den Schlüssel event hinzufügen ... entweder arbeiten, man muss nur mach sie gleich. Ich sehe jedoch kein Problem des Umfangs. Wenn Sie das vollständig ausschließen möchten, schneiden Sie einfach die Funktion getByValue über die Funktion getNegativeErrs aus und fügen Sie sie ein.

Verwandte Themen