Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Skillnader mot ECMAScript standarden

För att det ska vara enkelt att använda skriptspråket i Ethiris har vissa tillägg gjorts. Dessutom finns vissa begränsningar, framför allt för att förhindra risken för skript som hamnar i oändliga loopar.

ECMAScript-standarden har beteckningen ECMA-262 och finns tillgänglig på http://www.ecma-international.org/.

Tillägg i skriptspråket

return

Satsen return kan användas varsomhelst i ett skript, inte bara inuti funktioner.

Säker for-loop

Med den vanliga for-loopen som finns i ECMAScript kan man skriva loopar som inte stannar. Även while- och do-while-loopar har detta problem.

Att försäkra dig om att dina skript stannar kan därmed vara svårt när du har skrivit komplicerade loopar, därmed har Ethiris utökats med en variant på ECMAScripts for-in loop.

Se över dina skript och se om du kan ersätta dina for-, while- och do-while-loopar med den typ av for-in loop som beskrivs i detta avsnitt.

Tillägget till språket utgörs av en ny typ av objekt, Sequence-objekt, som skapas med Sequence-konstruktorn som finns i det globala objektet.

Exempel 1:

for (i in Sequence(5, 12)) 
{
	arr[i] = 0;
}

Denna loop sätter elementen med index 5 till 12 i arrayen arr till 0. Variabeln i kommer alltså få värdet 5 första gången loopen körs, 6 nästa gång osv. Om man ser Sequence(5, 12) som ett objekt som har egenskaperna 5,6,7,8,9,10,11 och 12 fungerar denna loop alltså nästan precis som den inbyggda for-in loopen i ECMAScript. Skillnaden är att i blir ett heltal i stället för en sträng. Dessutom kommer Sequence(1, 1000000) inte ta upp mer minne än Sequence(1,2). Skriver du Sequence(12,5) kommer styrvariabeln få värdena i omvänd ordning i stället.

Exempel 2:

var result = 0;
for (i in Sequence(1, 10)) 
{
	result = result + i;
}

Eftersom i alltid blir ett heltal, så kommer result att ha värdet (1+2+3+4+5+6+7+8+9+10): 55

inte värdet

“12345678910”

som man skulle fått om i hade varit ett värde av typen String. Plus-operatorn (+) utför nämligen sträng-konkatenering i ECMAScript om ettdera ledet är av typen sträng.

Händelser

I skriptmotorn har även lagts till Event-objekt och EventTarget-objekt som kan användas för att skicka en händelse, t.ex. ett event från ett COM-objekt.

Dessa objekt följer i stort sett specifikationen ”Document Object Model (DOM) level 3 events” från standardiseringsorganisationen W3C, World Wide Web Consortium. Specifikationen finns på http://www.w3.org/DOM/DOMTR.

synchronized

Ett nytt nyckelord har införts i skriptspråket, ”synchronized”. Detta nyckelord kan användas för att skapa synchronized-satser, där man synkroniserar åtkomsten till ett visst objekt så att endast en exekveringstråd kan använda objektet åt gången.

De objekt som är åtkomliga från flera olika trådar i Ethiris är DataStore samt variablerna i DataStore. Dessa används både av skripttråden samt av tråden som sköter OPC-kommunikation.

Exempel 1:

I följande exempel kan vi se till att kommunikationsvariablerna var1-var4 har konsistenta värden vid den tidpunkt de skrivs till OPC-servern, eftersom skriptet nedan inte kan köras samtidigt som OPC-tråden utför en skrivning.

synchronized(DataStore)
{
   DataStore.var1 = DataStore.var2 || DataStore.var3;
   DataStore.var4 = true;
}

Om man utelämnade synchronized-blocket, skulle det t.ex. kunna hända att värdena på var1-var3 skickas till OPC-servern efter värdet på var4, trots att satserna i skriptet ger sken av att var1-var3 ändras före var4.

Exempel 2:

I stället för att synkronisera på hela datalagret, kan man även synkronisera på en specifik variabel. På följande sätt kan vi säkerställa att variabeln var4 har samma värde varje gång den evalueras.

synchronized (var4)
{
   var1 = var4 + var4*var4;
}

Om man utelämnade synchronized-blocket, skulle det t.ex. kunna hända att OPC-servern notifierar Ethiris om en dataförändring för var4 medan uttrycket beräknas, så att om värdet förändras från 3 till 4 innan vi hunnit utföra additionen skulle man få värdet (3 + 44) i stället för förväntade (3 + 33).

Ett annat sätt att undvika detta problem är att kopiera var4 till en temporär variabel innan beräkningen utförs:

var tmp = var4;
var1 = tmp + tmp*tmp;

Begränsningar av skriptspråket

Etiketter

Raderna i ett skript kan inte ha etiketter. Du kan t.ex. inte skriva

etikett: myNumber = 7;

Om du utelämnar etiketten är ovanstående däremot giltig kod.

Reguljära uttryck

Skriptspråket implementerar inte stöd för reguljära uttryck. Du kan inte mata in reguljära uttryck som t ex

var myRegExp = /a[a-z]{2,4}/;

Egenskaper i det globala objektet

Följande egenskaper finns ej i det globala objektet.

Funktioner:

eval()

parseInt()

parseFloat()

decodeURI()

decodeURIComponent()

encodeURI()

encodeURIComponent()

String.prototype.localeCompare()

String.prototype.match()

String.prototype.search()

String.prototype.split()

String.prototype.toLowerCase()

String.prototype.toUpperCase()

String.prototype.toLocaleLowerCase()

String.prototype.toLocaleUpperCase()

Array.prototype.toLocaleString()

Array.prototype.concat()

Array.prototype.reverse()

Array.prototype.slice()

Array.prototype.sort()

Array.prototype.splice()

Function.prototype.toString()

Konstruktorer:

RegExp()

EvalError()

RangeError()

ReferenceError()

SyntaxError()

TypeError()

URIError()

Eftersom skriptmotorn inte innehåller reguljära uttryck kan String.prototype.replace inte ta ett reguljärt uttryck som första argument.