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