Laten we de uitvoering regel voor regel doorlopen, regel 8 toevoegen voor een beter begrip:
/* 1 */ function Foo()
/* 2 */ {
/* 3 */ this.prop1 = 20;
/* 4 */ //some code
/* 5 */ }
/* 6 */
/* 7 */ var a = new Foo()
/* 8 */ var b = Foo()
Regel 1 wordt uitgevoerd, de heap bevat nu één element, een functieobject met de naam Foo
. Op dit moment is Foo
niet uitgevoerd. Regels 2 t/m 5 worden op dit moment niet uitgevoerd, maar worden gebruikt als de body van Foo. Omdat Foo
niet is aangeroepen, is regel 3 niet aangeroepen voor een object, dus niets heeft een prop1
.
Regel 7 wordt uitgevoerd, de interpreter doet verschillende dingen:
- Het voegt een nieuw object toe aan de heap.
- Het geeft dit object de prototypeketen van
Foo
. Dit doet niets bijzonders in het geval van Foo
omdat we niets hebben toegewezen aan het prototype van Foo
, maar Foo
erft van Object
, dus het object heeft nu methoden zoals hasOwnProperty
en toString
.
- De interpreter roept
Foo
door het nieuw gemaakte object door te geven als this
.
- Regel 3 wordt uitgevoerd, waarbij 20 de eigenschap met de naam
prop1
wordt toegewezen. Of dit een nieuw object in de fysieke heap maakt of als het wordt toegewezen aan een primitieve sectie van het object, hangt er echt van af hoe de interpretator alles optimaliseert. Ik weet zeker dat V8 het toevoegen van een object aan de heap vermijdt.
- Het nieuwe object wordt toegewezen aan
a
in het variabele bereik van a
.
In feite voegt het maken van een functie de functie loader toe aan de heap (of mogelijk stack afhankelijk van het bereik en optimalisaties) en het uitvoeren van nieuwe Foo
voegt een nieuw object toe aan de stapel.
Maar wat als we nieuw
niet gebruiken?
Kijk voor het plezier naar het andere gedrag wanneer we new
niet gebruiken. Wanneer regel 8 wordt uitgevoerd, omdat we new
niet aanroepen, voeren we een normale functieaanroep uit en maken we geen nieuw object. Het volgende gebeurt:
- We call
Foo
on line one. Since we aren't in strict mode, this
is assigned to the global window
object.
- Line 3 executes, assigning
window.prop1 = 20
.
- The function returns
undefined
.
b
is set to undefined
.