Der er flere muligheder, og du kan f.eks. skrive noget i stil med:
function sReplace(str, a, b) { return str.split(a).join(b); }
- alt efter, hvad det skal bruges til - og hvordan.
Det er i øvrigt vigtigt at huske, at når man opretter en funktion med en function operator som i #1, er det meget vigtigt at afslutte udtrykket med et semikolon:
var sReplace = function (str, a, b) { return str.replace(new RegExp(a, "gi"), b); }; // <-- dér
Det har jeg dog aldrig haft problemer med før. Har generetlt ikke problemer med semi kolon, og tilføjer dem kun for at gøre det lettere for parseren ( hvis det giver menging)
Er det fordi der er regepx indblandet..eller er det bare generelt?
Normalt plejer jeg bare at wrappe i en function, og så kalde den.. men jeg kan da godt se at hvis man wrapper i en function, slipper man for overhovedet at have en instance af function (ved ikke om "instance" er det rigtige term, jeg er selvlært :P)
Det meste moderne JS er opbygget på denne måde. Der kan være flere årsager, men en af dem er at undgå, at det globale scope/namespace bliver 'forurenet' af et hav af variabler - altså at holde en del variabler i et lokalt scope bag en closeure.
Så snart browseren/fortolkeren har læst denne kode, vil funktionen setEvent indeholde script, der efterfølgende er afpasset, hvad den aktuelle browser understøtter
var foo = function(str) { alert("Hep"+str); }("Hey");
Closures er et enormt stærkt værktøj i JS - selvom visse browseres garbage collection (specielt IE's) i mange år havde svært ved at håndtere dem i meget dynamisk JS/DOM kode
Ja, JScript og JavaScript bygger på samme standard, ECMA. Det burde AS egentlig også, men Adobe løb for hurtigt og for langt forude, da der på et tidspunkt var tale om en ny version af ECMA. De fik implementeret en del, der aldrig blev til noget :o|
set value(){ return _value }, get value(val){ _value = val }
men 1. Kunne hvis ikke få det til at virke.. 2. Meget mærkeligt underscore konvetion 3. Eksemplet jeg så det brugt i, var via en prototype.. hvilket jeg ser tit i javascript(klasser) .. men det prøver jeg at holde mig fra.. ved ik hvorfor, synes bare det er noget rod =)
...selvom prototype ser ud til at være en måde man kan nedarve på... damn.. JS er lidt mere avanceret end AS :P , men kan godt lide at det er endnu mere "frit"
Det er meget almindeligt at prefix'e 'beskyttede' properties med en underscore:
function MyObj() { this._width = 50; } var p = MyObj.prototype; p.getWidth = function() { return this._width; }; p.setWidth = function(val) { this._width = val; };
Så kan du ikke skrive INSTANS.width = 123;, men skal gennem getter/setter. Du kan selvfølgelig altid skrive INSTANS._width = 123; ... so much for protection! =)
Du kan også skrive:
function MyObj() { this._width = 50; } var p = MyObj.prototype; p.width = function(val) { if (typeof val=="number") this._width = val; else return this._width; };
Så hedder både setter og getter INSTANS.width. Funktionaliteten afgøres af, om du sender et argument med eller ej.
Andre bruger en metode til at tilknytte properties med tilhørende getter og setter til en klasse:
function MyBaseObj() {
} var p = MyBaseObj.prototype; p.initProp = function(name, initVal) { if (!this.hasOwnProperty("_"+name)) { this["_"+name] = initVal; } var sUpperName = name.charAt(0).toUpperCase()+name.substr(1); this["get"+sUpperName] = function() { return this["_"+name]; }; this["set"+sUpperName] = function(val) { this["_"+name] = val; }; };
var obj = new MyBaseObj(); obj.initProp("width", 123);
Det virker ikke fordi _foo ikke er i defineret med this._for Og hvis jeg tilføjer this. så er variable jo tilgængelig til at ændre.. og hele ideen går lidt af det. =)
Nå men tak fordi du tog dig tid til at forklare.. jeg håber andre også newbs kan få gavn af dette.
Syntaksen hører til under ECMA5. I JavaScript betyder det fra version 1.8.5 (fra Firefox 4). Jeg er ikke sikker på, hvornår IE begyndte at understøtte syntaksen, men IE6 gjorde i hvertfald ikke. Jeg har ikke i skrivende stund mulighed for at teste i IE7 eller 8 =)
- lige med det eksempel, jeg går udfra jeg bare skal droppe window. hvis jeg er i jscript/cscript miljø
Jeg kan godt se man opnår "næsten" det samme..
Jeg troede også at hvergang man sagde "new" så oprettede man en instans af en klasse.
function myClass(val){ // indtil videre er dette bare en alm function. this._foo = val; // bortset fra at hvis det bare var en alm function, så ville this ikke give mening.
}
myClass.prototype = { // og vel også grunden til at man overhovedet kan bruge prototype };
jo mere jeg kigger på dit eksemepel i #16, jo mere ser det jo ud som om det er det samme vi gør.. bortset fra du bruger closure som class scope..
function myClass(){ var hej function myClass(){ hej = 10 // dette er i min verden en constructor function } myClass(); // bortset fra jeg ikke burde skulle kalde denne manuelt.. og defor er dette sikkert fuldstændigt en fuldstændig åndsvag fremgangs måde.. =P }
#51: Du opnår præcis det samme. Du opretter et object - og du kan ikke instantiere flere af samme slags. Der er ingen forskel på de to instanser, eller hvad de kan.
Normalt opretter new en ny instans af en klasse, men da din constructor er en anonym funktion i #45, kan du ikke oprette flere instanser. Når en instans er oprettet, er den bare et JS-object.
Spørger du f.eks. med:
alert(MySingleInstance instanceof Object);
- returneres i begge tilfælde true. Eneste forskel er:
alert(MySingleInstance.constructor);
Der er ingen forskel på deres opførsel/brug i øvrigt.
Indenfor din closure er du nødt til at 'klistre' constructoren fast på topobjektet, hvis den skal bruges i det globale scope. I en browser er det window objektet. I et andet miljø skal du bruge det aktuelle miljøs topobjekt.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.