Javascript
Transcription
Javascript
Javascript Einführung Einführung ● Entwickelt für Dynamik in Webseiten Einführung ● Entwickelt für Dynamik in Webseiten ● Funktional ● Prozedural ● Objektorientiert Variablen ● Datentypen: string, number, boolean, function Variablen ● Datentypen: string, number, boolean, function ● auto Konvertierung → Objekt num = 1; numStr = num.toString(); Datentyp: number Zugriff auf Number Objekt Variablen, global / lokal ● var → lokal ● ohne Schlüsselwort → global function () { var localVar = 1; globalVar = 1; } lokal global Variablen, dynamisch ● dynamische Typisierung Variablen, dynamisch ● dynamische Typisierung ● keine Typ-Überprüfungen! function add (a) { return a + 1; } num = 1; num = „1“; add (num); legale Zuweisung liefert: „11“ Funktionen ● sind Objekte Funktionen ● sind Objekte ● Parameter Angabe optional function sum() { count=0; for (var i=0; i<arguments.length; i++) count += arguments[i]; return count; arguments hält Argumente } sum.staticVar = true; sum (1, 10, 100); statische Variable Scope-Chain ● var bindet Variable an Scope Scope-Chain ● var bindet Variable an Scope ● Identifier werden in der Scope-Chain gesucht var i; for (i=1; i<=5; i++) { setTimeout ( function () { document.write (i); } , 1000 ); } Ausgabe: 66666 Closures ● ➔ Funktion gibt lokale Referenz zurück Garbage-Collector kann Funktion nicht aufräumen Closures ● ➔ Funktion gibt lokale Referenz zurück Garbage-Collector kann Funktion nicht aufräumen function func(x) { var secret=x; return function() {return secret;}; } a = func(1); b = func(2); a (); b (); ergibt: 1 ergibt: 2 Closures ● nur Referenzen löschen → Closure Auflösung ● ! unbeabsichtigte Speicher Allozierung ! Objekte ● keine Klassen Objekte ● keine Klassen ● new + Konstruktor → Objekt function constructor () { } var obj = new constructor (); Konstruktorfunktion new erzeugt Objekt Objekte, Eigenschaften function constr() { private Variable var secret = “psst“; this.publ = „hello“; this.meth = function () { return true; } öfftl. Eigenschaft + Methode } constr.static = „i am static“; constr.staticMeth = function() { } statische Eigenschaften Objekte, Vererbung ● Prototypen-Konzept Objekte, Vererbung ● Prototypen-Konzept ● prototype → ändert alle Objekte function constr () { this.a = function (){}; } obj1 = new constr(); constr.prototype.b = function (){}; obj2 = new constr(); obj1.b (); obj2.b (); obj1 + obj2 wurden um b erweitert Objekte, Vererbung function mammal () { var local = false; this.needsAir = true; } function human () { this.needsTV = true; } human.prototype = new mammal(); var bob = new human (); bob.needsAir; bob.needsTV; erbt öfftl. Eigenschaften verfügt jetzt über needsAir + needsTV Objekte, Vererbung ● nur einfach vererbbar ● nur öffentliche Eigenschaften vererbbar this - Zeiger ● this nicht fest! this - Zeiger ● this nicht fest! ● über call setzbar function constr(x) { this.secret = x; this.tell = function () { return this.secret; } } var a = new constr (1); var b = new constr (2); a.tell (); a.tell.call (b); ergibt: 1 ergibt: 2 this - Zeiger ● this keine feste Referenz auf aktuelles Objekt this - Zeiger ● this keine feste Referenz auf aktuelles Objekt ● call wird von Javascript implizit benutzt function constr(x) { this.secret = x; this.event_handler = function () { return this.secret; } } var a = new constr (1); document.body.onclick = a.event_handler; liefert undefined, NICHT 1 n-Damen-Problem ● Damen Zeile für Zeile in erste freie Position ● falls Versuch scheitert ➔ eine Zeile zurück, nächste freie Position ● wenn letzte Dame gesetzt ➔ Lösung gefunden n-Damen-Problem Koordinaten der Damen + 8x8 Array mit „belegt“ Zuständen function create_set () { return { dames: [], set: [ [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0] ] }; } function pos_free (x, y, set) { return (set.set[x][y] == 0); } 0 → platz frei function set_single_pos (x, y, set) { set.set[x][y] = 1; } 1 → platz besetzt n-Damen-Problem function set_dame (x, y, set) { set.dames.push ([x,y]); for (var i=0; i<8; i++) set.set[x][i] = set.set[i][y] = 1; var a = x-y; var b = x+y; for (var i=0; i<8; i++) { var c = a+i; if (c >= 0 && c <= 7) set.set[c][i] = 1; c = b-i; if (c >= 0 && c <= 7) set.set[c][i] = 1; } } Spalte + Zeile setzen Diagonalen setzen n-Damen-Problem var set = create_set (); var safe = [{entry: [0,0], set: copy_set(set)}]; for (var y=0; y<8; y++) { var found=false; for (var x=0; x<8; x++) { if (pos_free (x,y, set)) { safe.push ({entry: [x,y], set: copy_set (set)}); set_dame (x,y, set); found=true; break; } } if (!found) { var temp = safe.pop (); set = temp.set; set_single_pos (temp.entry[0], temp.entry[1], set); y = temp.entry[1]-1; } } alten Zustand speichern alten Zustand laden Javascript