2017-07-01 8 views
0

Ich bin eigentlich ahnungslos, ich starte diesen Javascript-Code mit Knoten und dann erwarte ich, dass es nur die Zahl 100 und 69 zeigt, aber das ist die Ausgabe beim ersten Start: undefined undefined 100 69 100 69. Das erste Mal, dass die Variablen als undefiniert angezeigt werden. Was mache ich falsch?Variable zeigt undefined

Auch ist dieser Code nur für Testzwecke ..

startCrash(); 

var currentCrashNumber = 100; 
var currentCrashSpeed = 100; 

function startCrash(){ 
    sendCrashNumber(); 

    setInterval(function(){ 
     if(currentCrashSpeed > 0){ 
      currentCrashSpeed = currentCrashSpeed+-1; 
     }else{ 
      clearInterval(this); 
     } 
    }, 1000); 
} 

var lijntjespeed = 69; 
function sendCrashNumber() {  
    console.log(currentCrashNumber); 
    console.log(lijntjespeed); 

    io.sockets.emit('message', { 
     crashMultiplier: currentCrashNumber, 
     type: 'updateCrash' 
    }); 

    setTimeout(sendCrashNumber, currentCrashSpeed);  
} 
+1

"currentCrashSpeed ​​= currentCrashSpeed ​​+ -1;" Möchten Sie erhöhen oder verringern? –

+0

@AlbertoTrindadeTavares + - ist das gleiche wie minus, es ist was auch immer, Dekrement :) (EDIT: also sollte es schneller gehen) –

+0

@Dinesh Ich bin mir nicht ganz sicher, was Sie bekommen? –

Antwort

2

Ihr Problem zu variable hoisting verwandt ist, da Sie startCrash an der Spitze des Codes und an dieser Stelle nennen, die Variablen currentCrashNumber und currentCrashSpeed sind noch nicht initialisiert. Das passiert, weil die Deklaration dieser Variablen an den Anfang des Codes gehängt wird. Wenn die Funktion aufgerufen wird, sind sie zunächst undefiniert.

Dies ist das Verhalten des Codes nach dem Hissen:

var currentCrashNumber; // undefined 
var currentCrashSpeed; // undefined 
var lijntjespeed; // undefined 

startCrash(); 

currentCrashNumber = 100; 
currentCrashSpeed = 100; 
lijntjespeed = 69; 

function startCrash(){ 
    sendCrashNumber(); 

    setInterval(function(){ 
     if(currentCrashSpeed > 0){ 
      currentCrashSpeed = currentCrashSpeed+-1; 
     }else{ 
      clearInterval(this); 
     } 
    }, 1000); 
} 

... 

Gerade die Forderung nach startCrash nach unten zu bewegen, und es wird wie erwartet.

Ein weiteres Problem im Code, wies darauf hin, jfriend00, ist in der clearInterval Anruf von startCrash Funktion. In Ihrem Code wird this als Parameter übergeben, während es ein Zeithandler sein muss.

Um dies zu beheben, können Sie die Rückkehr von setInterval zuweisen kann einer Variablen (die ein Timer ist) und verwenden stattdessen:

function startCrash(){ 
    sendCrashNumber(); 

    var timer = setInterval(function(){ 
     if(currentCrashSpeed > 0){ 
      currentCrashSpeed = currentCrashSpeed+-1; 
     }else{ 
      clearInterval(timer); 
     } 
    }, 1000); 
} 
+1

Das eine Mal stelle ich meine Variablen nicht auf die Spitze! Danke mein Retter! –

+0

Das OP zeigt keinen Aufruf von 'startCrash()' im geposteten Code, also wie können Sie erkennen, dass ihr Anruf an der falschen Stelle ist? Machst du nur eine glückliche Vermutung? – jfriend00

+0

Er erwähnte dies in einem Kommentar für die Frage. Dieser Aufruf sollte in den Code aufgenommen werden, um es deutlich zu machen. Ich habe einen Vorschlag für die Ausgabe –