2009-06-26 23 views
0

Warum ist das nicht ok?Warum sagt es xxx ist keine Funktion

aContract = function(){}; 
aContract.prototype = { 
    someFunction: function() { 
     alert('yo'); 
    }, 
    someOtherFunction: some$Other$Function 
}; 

var some$Other$Function = function() { 
    alert('Yo yo yo'); 
}; 

var c = new aContract(); 
c.someFunction(); 
c.someOtherFunction(); 

Firebug sagt c.someOtherFunction ist keine Funktion

Aber das funktioniert gut

aContract = function(){}; 
aContract.prototype = { 
    someFunction: function() { 
     alert('yo'); 
    }, 
    someOtherFunction: some$Other$Function 
}; 

function some$Other$Function() { 
    alert('Yo yo yo'); 
}; 

var c = new aContract(); 
c.someFunction(); 
c.someOtherFunction(); 

Was bin ich hier ??? Ich bevorzuge es, in JavaScript mit der ersten Methode zu programmieren, was normalerweise gut funktioniert, aber nicht korrekt funktioniert, wenn ich prototype.

Danke, ~ ck in Sandy Eggo

Antwort

3

Sie haben some$Other$Function zu aContract.prototype.someOtherFunction zugewiesen, bevor Sie tatsächlich some$Other$Function erstellen. Die Reihenfolge der Aussagen ist wichtig. Wenn Sie die Reihenfolge der Dinge wechseln werden Sie gut sein:

var some$Other$Function = function() { 
    alert('Yo yo yo'); 
}; 

aContract = function(){}; 
aContract.prototype = { 
    someFunction: function() { 
     alert('yo'); 
    }, 
    someOtherFunction: some$Other$Function 
}; 
4

Zum Zeitpunkt dieser ausgewertet wird:

aContract.prototype = { ... } 

dies noch nicht bewertet worden:

var some$Other$Function = function() { ... } 

So aContract.prototype.someOtherFunction ist auf undefined eingestellt.

Der Grund für die zweite Funktion ist, weil die Funktion Deklarationen (die zweite ist, die erste ist ein Ausdruck) vor allen anderen Aussagen ausgewertet werden. Es gibt weitere Details hier: Named function expressions demystified

0

Es scheint, dass im globalen Bereich var anders funktioniert als in funktionslokalen Bereichen. In funktionslokalen Bereichen werden var deklarierte Variablen an den Anfang der Funktion gehoben (d. H. Jede Variable, die irgendwo innerhalb einer Funktion mit dem Schlüsselwort var deklariert ist, ist irgendwo anders innerhalb dieser Funktion verfügbar). Aber im globalen Gültigkeitsbereich liefert vielleicht nur das Schlüsselwort function zur Deklaration einer Variablen das gleiche Ergebnis (d. H., Dass eine mit dem Schlüsselwort function deklarierte Variable irgendwo innerhalb dieses globalen Gültigkeitsbereichs verfügbar ist, sogar in Zeilen, die dieser Deklaration vorangehen).

+0

, die überhaupt nicht wahr. Aufruf von blah() zeigt "undefined" an: function blah() { alert (x); var x = 5; } –

+0

Das ist nicht ganz, was passiert. z.B. (function() {var a = x + 1; var x = 2; gib a zurück;})() gib NaN zurück. Sie könnten eher wie (function() {var a = function() {return x + 1}; var x = 2; return a()})() , das 3 zurückgibt. – BaroqueBobcat

1

Es ist wegen der hissen. Funktionsanweisungen werden an den Anfang ihres Bereichs verschoben.

Edit: Verification Crockford JavaScript: The Good Parts Seite 113.

Verwandte Themen