javascript: lambda functies

Alles over programmeren en development binnen de IT-wereld
Plaats reactie
brubbel
Elite Poster
Elite Poster
Berichten: 918
Lid geworden op: 04 jul 2012, 16:55
Uitgedeelde bedankjes: 76 keer
Bedankt: 174 keer
Recent bedankt: 1 keer

Code: Selecteer alles

var onChange = () => this._onChange.bind(this)();

var onChange = function() {
    this._onChange();
}.bind(this);

var onChange = this._onChange.bind(this);
Variable onChange wordt aan een button gekoppeld, dit terzijde.
onChange() werkt in de eerste 2 gevallen wel, in het laatste geval niet. Waarom juist?

Edit: dit lijkt belangrijk
Origineel is:

Code: Selecteer alles

this._onChange = Function.prototype;
Later wordt deze dynamisch opnieuw toegewezen:

Code: Selecteer alles

this._onChange = function myNewOnChange() {...};
In het niet-werkende geval eindig ik dus met:

Code: Selecteer alles

var onChange = Function.prototype.bind(this);
In de werkende gevallen zal de lambda functie de correcte myNewOnChange() aanroepen.

Thanks!
Gebruikersavatar
cptKangaroo
Elite Poster
Elite Poster
Berichten: 3057
Lid geworden op: 18 dec 2004, 14:33
Locatie: 053 Aalst
Uitgedeelde bedankjes: 666 keer
Bedankt: 227 keer
Recent bedankt: 2 keer

Misschien gelijkaardig aan dit: https://stackoverflow.com/questions/336 ... nctionname
(volg de hoisting link in het eerste antwoord). (Gokje)
Gebruikersavatar
JamesEarlGray
Elite Poster
Elite Poster
Berichten: 1322
Lid geworden op: 24 aug 2017, 13:04
Uitgedeelde bedankjes: 77 keer
Bedankt: 135 keer

De eerste twee toewijzingen aan de variable onChange, wijs je een functie toe aan die variabele. Dat kan je doen in Javascript; een functie verpakken in een variabele.

De derde keer wijs je puur de return-waarde toe aan die variabele, dus werkt die variabele uiteraard niet als functie, omdat er geen functie maar enkel een waarde in zit.
brubbel
Elite Poster
Elite Poster
Berichten: 918
Lid geworden op: 04 jul 2012, 16:55
Uitgedeelde bedankjes: 76 keer
Bedankt: 174 keer
Recent bedankt: 1 keer

Ik denk dat in het laatste geval de Function.prototype wel degelijk wordt aangeroepen. Mocht onChange een return value bevatten, zou er een TypeError: onChange is not a function moeten ge-raised worden bij de onChange() call, wat niet het geval is.
Corrigeer mij als dat niet zo is.

Mijn verwarring ontstaat -denk ik- doordat de this in javascript afhankelijk is van de scope, terwijl dat niet is bij c++ of self in python. Bijgevolg moet ik het this argument bind()-en aan de huidige scope, wat ervoor zorgt dat er een nieuwe functie wordt gegenereerd die onafhankelijk is van this._onChange.

En ik heb als beginner weer iets nieuw geleerd: hoisting!
Plaats reactie

Terug naar “Development”