javascript as a functional, dynamic language

69
JavaScript as a dynamic, functional language Door: Jan Sabbe & Wouter Groeneveld

Upload: wouter-groeneveld

Post on 11-Jul-2015

1.098 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Javascript as a functional, dynamic language

JavaScriptas a

dynamic,functional

language

Door:

Jan Sabbe &

Wouter Groeneveld

Page 2: Javascript as a functional, dynamic language

Inhoud

1. Context2. Primitives & objecten3. Prototypal inheritance4. Functies & closures5. Scoping & contexting6. Pitfalls

Page 3: Javascript as a functional, dynamic language

Hoe JS gebruikt wordt

<script>

function oei() {

doStuff();

i = 10;

copyPasta(this.i, 20);

}

function copypasta(i, j) {

alert(new Date(i).getTime());

return j;

}

</script>

<a onclick=“oei();”>lala</a>

Page 4: Javascript as a functional, dynamic language

Hoe JS gebruikt kan worden

<script>

$(document).ready(function() {

$(“#link”).click(MyStuff.oei);

});

var MyStuff = (function() {

function privateStuff() { ... }

return {

oei: function() {

...

}

};

})();

</script>

<a id=“link”>lala</a>

Page 5: Javascript as a functional, dynamic language

Primitives & objecten

Page 6: Javascript as a functional, dynamic language

Variable declaration

var variabele = 5;

var hallo = "hallo";

var 1 = “een”; // syntax error

var _ = “omgh4x”; // ok

Primitives

number

string

boolean

Immutable & case sensitive!

Page 7: Javascript as a functional, dynamic language

Speciale values

undefined: onbekende waardevar a;

a == undefined;

null: lege waardevar a = null;

a == null;

NaN: geen getalisNaN(parseInt(“bomma”)) == true

isNaN(undefined)== ??

Infinity: groter dan alle andere numbers1 / 0 == Infinity

Page 8: Javascript as a functional, dynamic language

typeof = keyword

geeft strings:

“object” (ook bij null)

“function” (ook al is een functie een object)“string”, “boolean”

“number” (ook bij Infinity, NaN)

“undefined”

Page 9: Javascript as a functional, dynamic language

String utility functions

str.split

str.indexOf

str.replace(regex)

str.toLowerCase

...

Zie API:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String

Page 10: Javascript as a functional, dynamic language

Objecten:

een map van key - values

value kan getal, string, object, functie zijn

Page 11: Javascript as a functional, dynamic language

manieren om aan te maken

literal

new Object()

var locatie = {

x: 3,

y: 4,

afstandTot: function () {

var dx = this.x + this.y;

return Math.sqrt(dx);

}

}

var locatie = new Object();

locatie.x = 3;

locatie.y = 4;

locatie.afstandTot = function () { … };

Page 12: Javascript as a functional, dynamic language

manieren om aan te maken

Literal objects syntax – opletten!!

dit wel:

var obj = {

key1: value1,

key2: value2,

key3: value3

};

dit niet:

var obj = {

var bla = 3;doeStuff();

};

Page 13: Javascript as a functional, dynamic language

lezen

wijzigen

toevoegen

verwijderen

console.log(locatie.x);

console.log(locatie[„x‟];

itereren

locatie.z = 1;

locatie[„z‟] = 1;

for (var key in locatie) {

console.log(locatie[key]);

}

delete locatie.z;

delete locatie[„zumba‟];

locatie.x = 43;

locatie[„x‟] = 43;

Page 14: Javascript as a functional, dynamic language

Functiesfunction eenFunctie(naam) {

console.log("Hello, " + naam);

}

Functie literals:

var eenFunctie = function(naam) {

console.log("Hello, " + naam);

}

Gevolg: géén overloading, slechts def. overschrijven

Page 15: Javascript as a functional, dynamic language

voorbeeld:

functie kan object retourneren

function createPunt(x,y) {

return {

x: x,

y: y,

afstandTot: function (anderPunt) {

return Math.sqrt(...);

}

};

}

Page 16: Javascript as a functional, dynamic language

Arrays: (= een object)var arr = ["a", "b", "c"];

Itereren:x.forEach(function(i) {

console.log(i);

});

for(var i = 0; i < ...)

Page 17: Javascript as a functional, dynamic language

Array utility functions

arr.length

arr.push, pop

arr.splice, slice

arr.shift, unshift

arr.sort

arr.filter, arr.map

...

Zie API:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

Page 18: Javascript as a functional, dynamic language

Associative Arrays => Objects

var objArr = {

0: "nul",

1: "een"

};

var arr = [ "nul", "een" ];

Page 19: Javascript as a functional, dynamic language

Lab 1

Page 20: Javascript as a functional, dynamic language

prototypes

object verwijst naar ander object (prototype)

locatie

myObject

Page 21: Javascript as a functional, dynamic language

opzoeken van property

altijd eerst in object

zelf opzoeken

locatie

myObject

Page 22: Javascript as a functional, dynamic language

opzoeken van property

locatie.x

locatie

myObject

Page 23: Javascript as a functional, dynamic language

indien niets gevonden,

zoeken in prototype

opzoeken van property

locatie

myObject

Page 24: Javascript as a functional, dynamic language

opzoeken van property

locatie.y

locatie

myObject

Page 25: Javascript as a functional, dynamic language

opzoeken van property

eventueel verder zoeken

locatie

myObject

anotherObj

Page 26: Javascript as a functional, dynamic language

opzoeken van property

locatie.w

locatie

myObject

anotherObj

Page 27: Javascript as a functional, dynamic language

wijzigingen

altijd in object zelf

locatie

myObject

Page 28: Javascript as a functional, dynamic language

wijzigingen

locatie.x = 4;

locatie

myObject

Page 29: Javascript as a functional, dynamic language

toevoegen

locatie.y = 3;

locatie

myObject

Page 30: Javascript as a functional, dynamic language

verwijderen

delete locatie.y

locatie

myObject

Page 31: Javascript as a functional, dynamic language

Object.create (ES5)

var punt = {

afstandTot: function(anderPunt) {

return Math.sqrt(...);

}

};

var punt1 = Object.create(punt);

punt1.x = 3;

punt1.y = 4;

var punt2 = Object.create(punt);

Page 32: Javascript as a functional, dynamic language

ECMAScript ?

ECMA= European Computer Manufacturers Association

= standaardisatie (de “spec”)

Browsers implementeren ECv5 = Javascript

Page 33: Javascript as a functional, dynamic language

2 objecten, 1 prototype ??

var proto = {

wow: “wow man da‟s vet!”

};

var obj = Object.create(proto);

var obj2 = Object.create(proto);

console.log(obj.wow == obj2.wow);

console.log(obj.wow);

proto.wow = “mind is blown, again...”;

console.log(obj.wow);

Page 34: Javascript as a functional, dynamic language

prototype is een object

kan dus steeds gewijzigd worden

wordt bijvoorbeeld gebruikt door es5-shim

om standaard API te implementeren op IE

Array.prototype.telEersteTweeOp = function () {

return this[0] + this[1];

}

[1,2].telEersteTweeOp();

Page 35: Javascript as a functional, dynamic language

Lab 2

Page 36: Javascript as a functional, dynamic language

Function arguments magic:

function wow() {

console.log(arguments[1]);

}

wow("jos", "lowie"); // prints "lowie"

Page 37: Javascript as a functional, dynamic language

closure:"een functie die de omgeving waarin hij is aangemaakt bijhoudt"

functieX(7)

functieY()

Page 38: Javascript as a functional, dynamic language

functieX()

functieY(3)

functieY(4)

Page 39: Javascript as a functional, dynamic language

Functie evaluatie = nieuwe omgeving!

var omgevingY = functieX();

omgevingY(3);

omgevingY(4); // arr = [3, 4]

functieX()(10);

// nieuwe arr = [10]

// vorige arr = [3, 4]

Page 40: Javascript as a functional, dynamic language

hoisting

var a = 3;

function f() {

console.log(a);

var a = 5;

}

f(); // wat is de uitkomst?

Page 41: Javascript as a functional, dynamic language

Best practice: definieer alle vars eerst:

function a() {

var a, b, c, ...;

...

a = 5;

}

JSLint checkt hierop.

Page 42: Javascript as a functional, dynamic language

Lab 3

Page 43: Javascript as a functional, dynamic language

Scope chaining: toplevel scope = window!

w = 6; // same as „window.w = 6;‟

// same as „var w = 6;‟

function F() {

var X = 55;

var Z = 10;

function FinF(){

var X = 50;

var Y = 60;

}

}

Page 44: Javascript as a functional, dynamic language

Scope chaining

Page 45: Javascript as a functional, dynamic language

function test () {

var a = 5;

if(a === 5) {

var b = 555;

...

}

console.log(b); // kan dit?

}

Page 46: Javascript as a functional, dynamic language

function test () {

var a = 5, b;

if(a === 5) {

b = 555;

...

}

console.log(b);

}

... maar wél Function level scope:

JS heeft géén Block level scope:

best practice: vars begin van functie zetten

Page 47: Javascript as a functional, dynamic language

Functie definieren en direct evalueren:

(function(){})();

Interessant voor encapsulatie!

Page 48: Javascript as a functional, dynamic language

function test () {

var a = 5;

if(a === 5) {

(function () {

var b = 555;

})();

}

console.log(b);

}

Page 49: Javascript as a functional, dynamic language

Private variabelen voor object:

function createPersoon() {

var naam = 'Jos';

return {

getName: function() {

return naam;

}

};

}

var persoon = createPersoon();

persoon.getName(); // === “Jos”

persoon.naam // === undefined

Page 50: Javascript as a functional, dynamic language

Module pattern:

var MOD = (function(dep1, dep2) {

var mr = "Mr.";

function createPersoon(naam) {

return {

getName: function() {

return mr + naam;

}

};

}

return {

init: function() { ... },

createPersoon: createPersoon

};

})(dependency1, dependency2);

Page 51: Javascript as a functional, dynamic language

Wanneer moet ik een module maken?

• Duplicatie • Plugin, framework, ...• Reuse (component-gebaseerd)

Wanneer mag ik geen module maken?

• Eenmalige code, uniek op 1 pagina• Weinig code (gebruik gewoon encapsulatie)

Hou het zo simpel mogelijk!

Page 52: Javascript as a functional, dynamic language

Context in functions

Page 53: Javascript as a functional, dynamic language

function afstander(anderPunt) {

return this.x + this.y;

}

var punt1 = {

x: 1,

y: 1,

afstandTot: afstander

}

var punt2 = {

x: 2,

y: 2,

afstandTot: afstander

}

op wat slaat this?

Page 54: Javascript as a functional, dynamic language

afstander.apply(punt1, [punt2]);

afstander.call(punt1, punt2);

afstander(punt1)

punt1.afstandTot(punt2)

punt2.afstandTot(punt1)

this wordt bepaald bij oproepen functie

this = punt1

this = punt2

this = window (globale object in javascript)

this kan expliciet opgegeven worden

this = punt1

this = punt1

Page 55: Javascript as a functional, dynamic language

callbacks en contexting:

var persoon = {

naam: "jos",

roep: function() {

alert("ey, " + this.naam);

}

}

setTimeout(persoon.roep, 1000);

Page 56: Javascript as a functional, dynamic language

callbacks fix closures:

var persoon = {

naam: "jos",

roep: function() {

alert("ey, " + this.naam);

}

}

setTimeout(function() {

persoon.roep()

}, 1000);

Page 57: Javascript as a functional, dynamic language

callbacks fix binding:

var persoon = {

naam: "jos",

roep: function() {

alert("ey, " + this.naam);

}

}

setTimeout(

persoon.roep.bind(persoon), 1000);

Page 58: Javascript as a functional, dynamic language

Lab 4 + JSLint

Page 59: Javascript as a functional, dynamic language

new operator: constructor functies

var jos = new Persoon()

var jos = Object.create(Persoon.prototype);

Persoon.call(jos);

is hetzelfde als

new

Page 60: Javascript as a functional, dynamic language

function Persoon() {

this.naam = “jos”;

// no return statement

}

Persoon.prototype.praat = function () {...}

var jos = new Persoon();

jos.naam === “jos";

jos.praat();

new operator: constructor functies

Page 61: Javascript as a functional, dynamic language

var jos = new Persoon();

jos instanceof Persoon === true;

// is hetzelfde als:

Persoon.prototype.isPrototypeOf(jos)

instanceof

Page 62: Javascript as a functional, dynamic language

Pitfalls

Page 63: Javascript as a functional, dynamic language

== doet aan type-casting

== (equality operator) probeert te casten naar zelfde type

gebruik

=== (identity operator) en

!== - doen geen type casting

Page 64: Javascript as a functional, dynamic language

function ding(a) {

if(!a) a = 5;

return a;

}

ding(400); // ?

ding(0); // ?

ding(null); // ?

Expliciet checken:if (a === undefined)

Falsy values:

Page 65: Javascript as a functional, dynamic language

Objecten als key:

var obj = {};

var key1 = new Object();

var key2 = new Object();

obj[key1] = “hi”;

obj[key2] = “yo”;

console.log(obj[key1]); // ??

Oplossing: toString() implementeren?

=> Gebruik een framework

Page 66: Javascript as a functional, dynamic language

typecasting lolligheid

[] + 23 ?

false + 23 ?

true + 23 ?

null + 23 ?

[1, 2] + 23 ?

“kadootje” + 23?

undefined + 23 ?

Infinity + 23 ?

Page 67: Javascript as a functional, dynamic language

Conclusie

Page 68: Javascript as a functional, dynamic language

Hoe JS gebruikt werd!!!

<script>

function oei() {

doStuff();

i = 10;

copyPasta(this.i, 20);

}

function copypasta(i, j) {

alert(new Date(i).getTime());

return j;

}

</script>

<a onclick=“oei();”>lala</a>

Page 69: Javascript as a functional, dynamic language

Voor wie nog honger heeft

http://www.jefklak.be/wiki/code/javascript/home