webForumDet fria alternativet

Skumm eval()

JavaScript

6 svar · 482 visningar · startad av lilja

Medlem sedan juli 20041 183 inlägg
Frågan#1

Försöker komma igång lite med AJAX och tittar på lite olika lösningar. Nu hakade jag upp mig på en eval som jag tycker är väldigt skumm..

eval(method + '(\'\', result)');

Om jag kör samma sak i en alert() så blir resultatet t.ex.

checkName('', result)

vilket känns rätt men är fel då det ska se ut som

checkName('', 1)

där 1 är variabeln result:s värde.När jag kör min kod så funkar de klockrent. Kan någon förklara så man fattar vad som händer?

Alltså blir jag konfunderad när result fungerar som en variabel när den bör fungera som statisk text??

Jag har ett exempel på http://code.liljaonline.se/ajax/dmz.php

Medlem sedan juli 20041 183 inlägg
#2

De är skummt, har suttit och funderat på detta en bra stund nu och så kommer man på något strax efter man tryckt på skicka.

Är det möjligen så att jag snöar in mig för mycket på php-syntaxen. Om det finns något i en sträng innanför eval som har samma namn som en variabel så funkar den helt enkelt som en variabel?

Om det är så varför fungerar då inte

eval('method(\'\', result)');
Medlem sedan aug. 20039 340 inlägg
#3

Du bör undvika att använda eval på det sättet så mycket du bara kan eftersom ditt returdata förr eller senare garanterat kommer att innehålla tecken som behöver escape'as som ' \ och radbrytning.
Jag föreslår en lösning där du enbart använder eval för att för att hämta en funktionsreferens, och sedan användar call för att kalla på metoden. För att göra det enkelt skickar jag i exemplet med funktionsparametrarna som en array, och dessutom kommer arrayens första element vara funktionsnamnet. Det är saker du får stå ut med så länge.

<script type="text/javascript">
function checkName(parametrar){
	alert("Detta är den input servern fick: " + parametrar[1] + "\nDetta är svaret jag fick: " + parametrar[2])
}

function callSomething(name){
	eval(name).call(this, arguments);

}

callSomething("checkName", "mininput", "minrespons")
</script>
Medlem sedan juli 20041 183 inlägg
#4

nitro2k01 skrev:

<script type="text/javascript">
function checkName(parametrar){
	alert("Detta är den input servern fick: " + parametrar[1] + "\nDetta är svaret jag fick: " + parametrar[2])
}

function callSomething(name){
	eval(name).call(this, arguments);

}

callSomething("checkName", "mininput", "minrespons")
</script>

Ja det där verkar ju fungera betydligt bättre. Men jag förstår inte riktigt hur du skickar parametrarna? Innehåller arguments alla argument i en javascript-funktion?? Kan du inte förklara vad som händer i callSomething() också? :) Resten förstår jag (tror jag i alla fall)...

Medlem sedan juni 20014 421 inlägg
#5

arguments är en array som innehåller alla parametrar som funktionen har tagit emot.

Här kan du läsa på lite om call()
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Function:call

Medlem sedan juli 20041 183 inlägg
#6

colione skrev:

Här kan du läsa på lite om call()
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Function:call

Ok, men jag fattar fortfarande inte alls vad this tillför i

eval(name).call(this, arguments);
Medlem sedan aug. 20039 340 inlägg
#7

Det kallar på funktionen som det objektet man kallar den för refererar till, i detta fall eval(name).
Men du had lika gärna kunnat göra eval(name)(arguments); i detta fall.

261 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)