Frage

Oder genauer auf das, was ich brauche:

Wenn ich eine Funktion innerhalb einer anderen Funktion aufrufen, wird es die Variable innerhalb der Aufruffunktion oder von der Ebene oben ziehen? Ex:

myVar=0;

function runMe(){
    myVar = 10;
    callMe();
}

function callMe(){
   addMe = myVar+10;
}

Was bedeutet meineVar am Ende als wenn callme () durch RunMe () aufgerufen wird?

War es hilfreich?

Lösung

Jeff ist richtig. Beachten Sie, dass dies nicht wirklich ein guter Test für statischen Scoping ist (die JS hat). Ein besseres wäre:

myVar=0;

function runMe(){
    var myVar = 10;
    callMe();
}

function callMe(){
   addMe = myVar+10;
}

runMe();
alert(addMe);
alert(myVar);

In einer statisch scoped Sprache (wie JS), die mit 10 Warnungen und 0. Der var myVar (lokale Variable) in RunMe Schatten die globale myVar in dieser Funktion. Es ist jedoch keine Wirkung in callme hat, so callme die globale meineVar verwendet, die bei 0 noch ist.

In einer dynamisch scoped Sprache ( im Gegensatz zu JS), würde callme erben Umfang von RunMe, so addme 20. Hinweis werden würde, dass meineVar noch 0 auf der Hut sein würde, weil die Warnung nicht erbt Umfang von jeder Funktion.

Andere Tipps

Wenn Sie Ihre nächste Zeile callme ();. , dann wird addme 10 sein, und myVar 0 sein

Wenn Sie Ihre nächste Zeile RunMe ();. , dann wird addme 20 sein, und myVar wird 10 sein

Verzeihen Sie mir zu fragen - was hat das mit statisch / dynamisch Bindung zu tun? Ist das nicht myvar einfach eine globale Variable und nicht der prozeduralen Code (alles auf das Call-Stack auspacken), um die Werte bestimmen?

Variablen wird in JavaScript statisch scoped (dynamisches Scoping ist wirklich eine ziemlich schmutzige Angelegenheit: Sie mehr darüber auf Wikipedia ).

In Ihrem Fall aber sind Sie eine globale Variable verwendet wird, so werden alle Funktionen, die gleiche Variable zugreifen. Matthew Flaschen Antwort zeigt, wie Sie können es ändern, so dass der zweite myVar ist eigentlich eine andere Variable.

dieser Seite erklärt, wie die globalen vs. lokale Variablen in JavaScript erklären , falls Sie sich nicht allzu vertraut mit ihm. Es ist anders, als die meisten Skriptsprachen tun. (Zusammengefasst:. Der „var“ Keyword macht eine lokale Variable, wenn innerhalb einer Funktion deklariert, da sonst die Variable ist global)

Wenn Sie das Stichwort var verwenden Ihre Variablen zu definieren, endet alles auf eine Eigenschaft auf dem Objekt window zu sein. So Ihr Code wäre gleichbedeutend mit dem folgenden:

window.myVar=0;

function runMe(){
    window.myVar = 10;
    window.callMe();
}

function callMe(){
   window.addMe = window.myVar+10;
}

Wenn Sie dies im Auge behalten, soll es immer klar sein, was geschieht.

Soweit ich verstehe, eine Variable, ohne die var Stichwort behandelt wird global , mit ihm, seinem lokalen scoped, so:

// This is a local scoped variable.
var local_var = "something"; 

// This is a global scoped variable.
global_var = "something_else";

Als guter Praxis JS, empfiehlt es sich, immer fügen Sie die var Stichwort.

Ich möchte, dass die Lambda-Ausdrücke hinzuzufügen sind auch statisch an der Stelle scoped, dass der Ausdruck definiert ist. Zum Beispiel:

var myVar = 0;

function foo() {
    var myVar = 10;
    return { bar: function() { addMe = myVar + 10; }}
}

var myObj = foo();

var addMe = 6;
alert(addMe);

myVar = 42;
myObj.bar();

alert(addMe);

Dies wird angezeigt 6 und 20.

myVar=0;

function runMe(){
    myVar = 10;
    callMe();
}

function callMe(){
   addMe = myVar+10;
}

Was die Ausgangs meineVar angeht und addme beide werden globale Variable in diesem Fall, wie in Javascript, wenn Sie nicht über eine Variable mit var deklarieren dann implizit erklärt sie es als globale daher, wenn Sie RunMe () aufrufen, dann meineVar wird den Wert 10 und addme wird 20 haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top