JavaScript

JavaScript (esperantigite ĜavaSkripto aŭ JavaSkripto) estas interpreta, objektema programlingvo kreita en 1995.
Oficiale JavaScript-on difinas la normo ECMA-262, alinome ECMAScript. La nuna versio de tiu normo estas la tria, sed la kvina versio de tiu normo projektas anstataŭigi ĝin[1]. La diversaj TTT-legiloj sufiĉe bone konformiĝas al tiu normo, sed ili kaŭzas programajn komplikojn pro malsimilaj adaptoj de la dokumentobjekta modelo (normo dom), tra kiu JavaScript manipulas la fenestrajn objektojn.
Uzo de la lingvo
Ĝin funkciigas TTT-legiloj (t.e., "retumiloj"). Pro sekureco de personaj komputiloj ĝi ne skribas sur diskojn. Sekve ĝi nur modifas tion, kio aperas en la legilaj fenestroj. Iam oni trovas, ke eĉ ĉe jam ekzistaj malpermesoj eblas krei per Ĝavaskripto programon, kiu povas damaĝi. Ekzemple, antaŭ kelkaj jaroj kelkaj version de la lingvo malpermesis, ke programo aperigu fenestrojn, kiuj estas tro malgrandaj, kvankam novaj fenestroj aperas intern retumilo kaj ŝajnas, ke ili povas fari nenion malbonan.
Utilo de la lingvo estas, ke dank ĝi retumilo liberiĝas de revoki paĝon, se necesas tasko, en kiu konservendas nenio interreten (Ĝavaskripto meme faras la taskon, dank tio, ke Ĝavaskripto kapablas ŝanĝi bildon, kiu okupas retumilan ekranon, kaj senti komandojn de homo). Ekzemple, Ĝavaskripto povas kontroli ĝuston de informacio, kiun homo provas sendi per retumilo (Ĝavaskripto povas insulti, se la homo tajpas vortojn en tabelon, en kiun endas tajpi nur nombrojn, ktp.). Nature, la tasko, kiun faras Ĝavaskripto, devas esti ne tre malfacila, ĉar komputilo, en kiu lanĉitas retumilo, eblas esti ne sufiĉe forta.
Unu el novaj uzoj de Ĝavaskripto estas malreale rigardi programojn por poŝtelefonoj sen lanĉi ilin en reala poŝtelefono.
Ĝavaskripto naskas retumile bildon, kiu similas tion, kio videblas poŝtelefone.
Se en lanĉo nenio konservendas por uzati en estontaj lanĉoj, malreala lanĉo tute sufiĉas (ekzemple, poŝtelefonaj videoludoj). Famas, ekzemple, ĉi tia ĝavaskripta libraro por Androidoj Sencha Touch.
Ekzemploj
JavaScript ne tipigas variablojn. Variablojn oni ne bezonas deklari por ke ili estu uzeblaj.
x = 1
x = "Hello World!"
y = x + 2
// “y” valoras "Hello World!2".
Vi povas vidi, ke, malsimile al Ĝavo, oni ne devas uzi punktokomojn inter komandoj, se la komandoj ne apartenas al la sama linio. Krome, oni ne bezonas uzi punktokomon post komando, se la komando estas lasta.
Tiel en JavaScript oni deklaras funkciojn:
f = function(x, y) { return x (y) }
Vi povas vidi, ke funkcio povas esti argumento por alia funkcio (tra la argumento "x" oni povas meti funkcion).
Ekzistas ilo por stiri videblon de variablo ekster funkcio.
Ĉi tiu ilo estas la vorto var
:
g = function(x, y) { s=x+y; var s; return s*2}
La variablo s
ne videblas ekster la funkcio g pro la komando "var s
".
Objektoj
Objektoj aperas en la lingvo tre simple. Ĉiu variablo povas ekhavi anojn, post ĉi tio ĝi estos objekto:
g={};
g.nomo=1
Sama senco:
g={nomo:1}
Vi vidas objekton kun unu ano: nomo
. Se vi provos akiri, ekzemple, g.agho
, komputilo respondos "undefined
" (nedifinita), sed ne "null
" (malplena).
Ĉiu variablo, ne apartenanta al objekto, estas reale ano de la speciala objekto window
(t.n. "global object
"). Do, oni povas akiri la variablon g
ankaŭ per la nomo "window.g
".
Ekzistas du vojoj por atingi anon de objekto. Ekzemple, por akiri la anon "nomo
" de la objekto "g":
g.nomo
g["nomo"]
Dank'al la dua vojo oni povas rigardi akiron pri ano de objekto kiel funkcion, kies argumentoj estas la objekto kaj nomo de la ano:
function(g){
for(i in g){
alert(g[i]);
}
}
Krome, la dua vojo permesas uzi kelkajn vortojn por nomi anojn:
ameriko={"suda parto":"Kubo","norda parto":"Usono"};
alert(ameriko["suda parto"]);
Krome, la dua vojo permesas uzi nombrojn por nomi anojn (speciala speco de objektoj, "Array
" = tabelo):
teamo=["Johano","Paŭlo","Ringo","Georgo"];
/*pli mallonga vojo por esprimi la komandon team=[0:"Johano", 1:"Paŭlo",2:"Ringo",3:"Georgo"];*/
alert(teamo[0]);
Ano de objekto povas esti funkcio. Funkcio povas koni objekton, kies ano ĝi nun estas, per la speciala nomo this
.
"Scope" kaj "Closure"
Rigardu ekzemplon, en kiu funkcio naskiĝis interne de alia funkcio:
v=function(){
var g="Ĝise";
var h=function(){
alert(g);
};
g="Poste";
return h;
};
v()();
Multaj homoj opinias, ke la skripto devas mesaĝi "Ĝise".
Ili pensas, imagante, ke post tio, ke la funkcio h
naskiĝis, la funkcio h ne dependas de la variablo g
. Sed reale
la skripto mesaĝas "Poste". Kvankam la variablo g
ne videblas ekster la funkcio v
,
kreintoj de Ĝavaskripto permesis al la funkcio, kiun donas la funkcio v
, uzi la variablon g
. Do laŭ la lingvo Ĝavaskripto
eblas, ke rezulto de la funkcio v
private posedas variablon. Ĉi tia variablaro, posedata private, nomiĝas "scope"
(angle: "spaco de nomoj").
"Closure" (angle: "adiaŭo") estas tio, kio uzas la nomspacon "scope". Ĝis morto de ĉiu "closure" la ilo "Garbage collector" (rubkolektilo) ne rajtas liberigi
memoron, kiun okupas "scope".
En la lasta ekzemplo "closure" estas rezulto de la funkcio v
, kiu estas ankaŭ funkcio.
Naski objektojn per la vorto new
Kio okazos, se funkcio, kiu uzas la nomon this
, estas nenies ano?
La vorto this
signifos novan objekton, kiu naskiĝos pro voko de la funkcio:
virino=function(){
this.vesto="robo";
};
onklino=new virino();
Atingi ĉi tiun objekton oni povas per la speciala vorto new
(por ne konfuzi al rezulto de la funkcio, oni ĝin ne atingas per rekta voko "onklino=virino()
", ĉar ĉi tiel oni povas atingi tion, kio lokiĝas post la vorto return
, anstataŭ tion, kion signifis la nomo this
interne de la funkcio).
Do ĉiu funkcio estas kiel klaso en Ĝavo, aperas parenceco inter objektoj.
Oni povas ekscii, ĉu objekto apartenas klason per la funkcio instanceof
. Ekzemple: onklino instanceof virino
estas true
.
Reale, ĉiu simpla tipo en Ĝavaskripto estas klaso. Ekzistas klaso:
String
= karaktraroNumber
= nombroBoolean
= buleaArray
= tabeloFunction
= funkcioObject
= objekto
Ekzemple, ĉiu objekto havas la anon toString()
, kaj la primitivaj tipoj ne estas escepto (malkiel Ĝave):
a=3;
alert(a.toString());
Heredi
Ĉiu funkcio havas anon "prototype", en kiun oni povas meti objekton (ne funkcion!), kies ecojn ĉiuj idoj de la funkcio heredu. Ekzemple:
patrino=new virino();
patrino.okuloj="bluaj";
knabino=function(){
this.karaktero="malbona";
};
knabino.prototype=patrino;
fratino=new knabino();
alert(fratino.okuloj);
//okuloj de fratino estas tiaj, kiaj estas okuloj de patrino ("bluaj")