Als ich John Resigs Learning Advanced Javascript las, stieß ich auf zwei Folien, die ich nicht vollständig verstehe.Verweise auf Eigenschaften, die anonyme vs. benannte Funktionen sind
Folie # 13 - Referenzieren Sie eine Eigenschaft, die eine anonyme Funktion ist. Die zweite Behauptung schlägt fehl.
var ninja = {
yell: function(n){
return n > 0 ? ninja.yell(n-1) + "a" : "hiy";
}
};
assert(ninja.yell(4) == "hiyaaaa", "A single object isn't too bad, either."); // PASS
var samurai = { yell: ninja.yell };
var ninja = null;
try {
samurai.yell(4);
} catch(e){
assert(false, "Uh, this isn't good! Where'd ninja.yell go?"); // FAIL
}
Folie # 14 - Referenzieren Sie eine Eigenschaft, die eine definierte Funktion ist. Die zweite Behauptung passiert.
var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
assert(ninja.yell(4) == "hiyaaaa", "Works as we would expect it to!"); // PASS
var samurai = { yell: ninja.yell };
var ninja = {};
assert(samurai.yell(4) == "hiyaaaa", "The method correctly calls itself."); // PASS
Der einzige Unterschied ist, dass yell
ist eine benannte Funktion in Schlitten 14. Warum wird der Verweis auf eine Eigenschaft als benannte Funktion definiert bleiben auch nach dem ursprünglichen Objekt (ninja
) auf ein neues Objekt Einstellung (oder sogar null)?
@Weedoze - Nein. Funktionsdeklarationen werden gehisst. Funktionsausdrücke sind nicht. Funktionsdeklarationen * müssen * benannt sein. Funktionsausdrücke ** können ** benannt werden. Diese Frage betrifft den Unterschied zwischen benannten und anonymen Funktionsausdrücken. Es gibt keine Funktionserklärungen. – Quentin