In beiden Beispielen definieren Sie die Variable Array
als function
, die this
an secrets
zuweist. Es ist einfach so, dass bereits ein globales Objekt namens Array
vorhanden ist, das andere JS auf der Seite möglicherweise als Constructor
verwenden, um Arrays zu erstellen. Wenn Sie in Ihre Konsole wechseln und Array als etwas anderes zuweisen, erhalten Sie möglicherweise Fehler von Code, der explizit von Array
abhängt. Arrays, die wörtlich mit []
gemacht wurden, funktionieren jedoch weiterhin gut, und tatsächlich zeigt ihre __proto__
immer noch, was Array.prototype
war. Also:
var arr1 = new Array('a','b','c');
// arr[0] -> 'a'
var arr2 = ['d','e','f'];
// arr[0] -> 'd'
var secrets;
Array = function() { secrets = this; };
var arr3 = new Array('g','h','i'); // nothing wrong here, because Array is a function
// arr3[0] -> undefined
// Array is just a function, you can't make arrays with new Array anymore
// and arr3 is just a function
var arr4 = ['j','k','l'];
// arr4[0] -> 'j'
// making array literals still works
wie für this
, nichts Ungewöhnliches, folgt noch die Regeln des this
. Die Tatsache, dass Sie Array
eine Funktion zuweisen, ändert nicht, wie sich this
verhält. so this
Punkte auf das globale Objekt, das im Browser window
ist, wenn Sie mit new
instanziiert oder verwenden call
oder apply
der Unterschied zwischen den beiden Proben ist der Unterschied zwischen einem Funktionsausdruck und Funktionsdeklaration finden Sie unter: What is the difference between a function expression vs declaration in Javascript?
Sie stellen hier zwei Fragen. Wie das funktioniert, wird in der MDN-Dokumentation erklärt (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/this) (kurz: der Wert hängt davon ab, wie die Funktion ist.) genannt) und ob 'Array = function() ...' oder 'function Array() ...' das gleiche ist [in dieser Frage] beantwortet (http://stackoverflow.com/q/336859/218196). –
danke Felix. In Bezug auf "das" habe ich die Dokumentation gelesen, konnte aber nicht herausfinden, worauf sich "das" im obigen Kontext bezieht ** ... Können Sie oder jemand anders helfen? Bezüglich des zweiten Teils meiner Frage habe ich den Beitrag gelesen, den Sie mir gegeben haben, und ich verstehe jetzt besser. – balteo
Wenn Sie 'Array' mit' new' aufrufen, dann verweist es auf ein leeres Objekt, das von 'Array.prototype' erbt. Wenn es ohne 'new' aufgerufen wird, bezieht es sich auf' window'. Wenn es über '.call' oder' .apply' aufgerufen wird, verweist es auf das Element, das als erstes Argument übergeben wird. Um zu wissen, wie es heißt, muss man sich 'JSON.parse' anschauen. –