2016-12-24 1 views
7

Ja, ich weiß, dass das wahrscheinlich eine sehr dumme Frage ist, aber das nervt mich schon eine Weile.Warum Funktionsparameter Vs. Globale Variablen?

Ok, also lerne ich schon eine Weile JavaScript und habe alles perfekt verstanden. . .except für Funktion "Parameter" (ich glaube, sie werden genannt).

Mir wurde beigebracht, dass sie wie so funktionieren:

function test(number) { 
 
    document.write(number); 
 
    }; 
 

 
test(1); 
 
test(12);

Dies macht Sinn für mich. In letzter Zeit bin ich jedoch auf etwas anderes gestoßen.

var counterDays = document.getElementById('days'); 
 
var counterHours = document.getElementById('hours'); 
 
var counterMinutes = document.getElementById('minutes'); 
 
var counterSeconds = document.getElementById('seconds'); 
 

 

 
var date = new Date('December 28, 2016 00:00:00'); 
 

 
function updateTimer(date) { 
 
    
 
    var time = date - new Date(); 
 
    
 
    return { 
 
     'days': Math.floor(time/(1000 * 60 * 60 * 24)), 
 
     'hours': Math.floor((time/(1000 * 60 * 60)) % 24), 
 
     'minutes': Math.floor((time/1000/60) % 60), 
 
     'seconds': Math.floor((time/1000) % 60), 
 
     'total': time 
 
    }; 
 
}; 
 

 
function startTimer(counterDays, counterHours, counterMinutes, counterSeconds, date) { 
 
    
 
    var timerInterval = setInterval(function() { 
 
     var timer = updateTimer(date); 
 
     
 
     //Changes the text of the 'counter' 
 
     counterDays.innerHTML = timer.days; 
 
     counterHours.innerHTML = timer.hours; 
 
     counterMinutes.innerHTML = timer.minutes; 
 
     counterSeconds.innerHTML = timer.seconds; 
 
     
 
     window.onload = function() { 
 
    
 
    startTimer(counterDays, counterHours, counterMinutes, counterSeconds, date); 
 
     };
<span id="days">&nbsp;</span> 
 
<span id="hours">&nbsp;</span> 
 
<span id="minutes">&nbsp;</span> 
 
<span id="seconds">&nbsp;</span>

Was verstehe ich nicht ernst ist, warum die updateTimer innerhalb der Klammern muss immer date, wenn die Variable date eine bereits vorhandene Variable im globalen Bereich ist. Gleiches mit startTimer. Ich verstehe nicht, warum ich das weitergeben muss. Warum nicht einfach auf die Variable innerhalb der Funktion zugreifen, da sie einen globalen Geltungsbereich hat, und damit fertig sein. Stattdessen muss ich die Variable als Parameter übergeben, damit die Funktion funktioniert.

Ich habe versucht und versucht, aber der einzige Weg, um die Funktion funktionieren zu lassen, ist durch die Variablen übergeben. Warum das???

Als ich noch lerne, habe ich im Internet nach mehr Informationen über Funktionen und ihre Parameter gesucht, aber alle zeigen mir etwas ähnlich zu meinem ersten Beispiel. Ich weiß, dass das alles wahrscheinlich nur über meinen Kopf geht, aber für das Leben von mir verstehe ich es einfach nicht.

Hinweis: Ich lerne immer noch, tut mir leid, wenn diese ganze Frage einfach dumm ist.

Auch der Code für den JS, mit dem ich ein Problem habe, wird nicht ausgeführt. Dies liegt daran, dass ich nicht meinen gesamten Code eingeben möchte, sondern nur den Code, mit dem ich Probleme habe.

+0

„Warum greifen nicht nur die Variable innerhalb der Funktion, da sie einen globalen Geltungsbereich haben und damit erledigt werden. " Stellen Sie sich vor, Ihr Programm wächst in der Größe 10x oder 100x größer. Es wird unhandlich werden. –

+0

Es tut mir leid, aber ich verstehe nicht, warum das Entfernen der Parameter mein Programm wachsen lassen würde. . . – BZCC

+1

Sie müssen * sie * nicht als Parameter übergeben. Aber es macht das Programm leichter zu handhaben. Schlagen Sie die Wörter "Verkapselung" und "Abstraktion" nach. Sie wollen nicht versuchen, die gesamte Struktur eines Systems gleichzeitig in Ihrem Kopf zu halten; vielleicht kannst du es tun, aber jeder andere, der an deinem Code arbeitet, kann nicht (und wenn sie etwas verändern, wird es dein mentales Modell zerstören). – Kittsil

Antwort

8

Statt sein Ich muss in der Variablen als Parameter zu übergeben, für die Funktion arbeiten.

Sie müssen Ihre Funktionen nicht mit Parametern definieren.Sie können sie höhere Umfang Variablen

https://developer.mozilla.org/en-US/docs/Glossary/Scope

Diese Nutzung aufzurufen:

var x = 'baz'; 
function foo(x) { 
    return x; 
} 
foo(x); 

das Gleiche wie tun:

var x = 'baz'; 
function foo() { 
    return x; 
} 
foo(); 

Schreiben von Funktionen, die Parameter nehmen als Eingabe halten hilft Code modular und Nebenwirkung frei unter vielen anderen Vorteilen ...

1.) Das zweite Beispiel wird immer einen Fehler werfen, wenn x bei einem höheren Bereich nicht erreichbar ist

2.12) Wenn eine andere Funktion den Wert von x mutierte, würde dies die Ausgabe des zweiten Beispiels beeinflussen und zu führen unerwartetes und möglicherweise schwer zu debuggendes Verhalten in Ihrer Anwendung. Während ich immer sicher, ob der Ausgang des ersten Beispiel sein kann

3.) Es ist viel einfacher durch zu lesen und Code beizubehalten, die

im Stil des ersten Beispiels geschrieben
+1

Gute Antwort. Es wäre wirklich großartig, wenn Sie näher darauf eingehen würden, warum es eine gute Idee ist, modular zu sein. – Kittsil

+0

Vielen Dank! Jetzt weiß ich! – BZCC

2

Wie ich sehe, sehen Sie den Code

var timer = updateTimer(date); 

Bitte Datum Parameter hier sowie in der aufgerufenen Funktion entfernen. Jetzt funktioniert die Datumsvariable wie im globalen Bereich. So wird es

function updateTimer() 
{ 
//date variable will be present here as global variable  
} 
var timer = updateTimer(); 
+0

Tut mir leid, aber Sie beantworten meine Frage nicht wirklich. – BZCC

+0

Einfach, übergeben Sie nicht das Argument Datum in der aufrufenden Funktion und nicht den Parameter in der aufgerufenen Funktion. Daher wird das von Ihnen angegebene Datum als globaler Gültigkeitsbereich behandelt. Ich habs? –

+0

Ok, ich verstehe, und es tut mir leid, wenn ich mich dumm anhöre, aber ich wollte mehr darüber wissen, was der Zweck dieser Parameter ist, und nicht, wie man sie entfernt. Leider gab es bereits eine andere Antwort, die diese Frage beantwortet hat, Danke für den Versuch, trotzdem zu helfen :) – BZCC