Gå til innhold

ProgrammeringsBaren! Småprat, om det du elsker!


Anbefalte innlegg

 

 

Skulen burde heller fokusere på Python. Som verkeleg skinner når det kjem til matteoppgåver og som er veldig relevant, framfor websider som roboter vil automatisk generere for oss i framtida.

 

 

Jeg tror neppe man noen gang finner en robot som skriver som William Shakespeare.

 

 

 

Begynner å nærme seg Mozart eller Beethoven iallefall http://artsites.ucsc.edu/faculty/cope/Emily-howell.htm

Lenke til kommentar
Videoannonse
Annonse
  • 3 uker senere...

Med tanke på den evige kampen blant nettlesere om å ha den raskeste javascript-motoren, så begynte jeg å lure på en ting:

Om man skal lage en js-motor, er det tilstrekkelig å kunne parse et helt program om gangen, eller er js lagd sånn at det kan finne på å skrive seg selv underveis?

 

Edit: Og er det en fornuftig grunn til at å aksessere en udefinert variable er en feil, mens å aksessere en udefinert property ikke er det?

Endret av Emancipate
Lenke til kommentar

Det var mer noe sånt jeg tenkte på:

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		
		<script type="text/javascript">
			document.writeln('alert("text");</scr'+'ipt>');
Jeg får ikke feilmelding, ikke riktig melding, og ikke noen annen melding heller. :hmm:

 

 

Dette skal gi deg SyntaxError: Unexpected token < fordi resten av dokumentet vil bli parset som JavaScript

 

Redigert 1: gitt at du closer head og html taggene.

Redigert 2: det kan vel også komme litt an på htmlmotoren til browser. Chrome sin har jeg erfart at emitter closing tags der den mener det skal være.

Endret av Enthroner
Lenke til kommentar

Det er ikke noe "resten av dokumentet", det der er hele.

 

Her lurer jeg også på hva som egentlig skjer:

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		
		<script type="text/javascript">
			document.writeln('<scr'+'ipt type="text/javascript">alert("text");</scr'+'ipt>');
		</script>
		
	</head>
	<body>
	</body>
</html>
Så langt, så ugreit, men vent på denne:

document.writeln() burde skrive på slutten av dokumentet, deretter kjøres de neste to linjene, og så til slutt alert(). Dermed burde det stå "textalphabeta". Isteden avbrytes scriptet med feilmelding "undefined variable b" i console.

 

Men sett var foran b, og vips kjører scriptet. Og gir meldingen "textundefinedundefined". :confused: Hvorfor får jeg ikke enten feilmelding eller "textalphabeta"?

 

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		
		<script type="text/javascript">
			document.writeln('<scr'+'ipt type="text/javascript">alert("text"+a+b);</scr'+'ipt>');
			var a = "alpha";
			b = "beta";  // var b = "beta"
		</script>
		
	</head>
	<body>
	</body>
</html>
Endret av Emancipate
Lenke til kommentar

Det er ikke noe "resten av dokumentet", det der er hele.

 

Her lurer jeg også på hva som egentlig skjer:

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		
		<script type="text/javascript">
			document.writeln('<scr'+'ipt type="text/javascript">alert("text");</scr'+'ipt>');
		</script>
		
	</head>
	<body>
	</body>
</html>

*Resulterer i en alert og et resultat som ser slik ut (med chrome):

<!DOCTYPE html>
<html><head>
		<title></title>
		
		<script type="text/javascript">
			document.writeln('<scr'+'ipt type="text/javascript">alert("text");</scr'+'ipt>');
		</script><script type="text/javascript">alert("text");</script>

		
	</head>
	<body>
	
</body></html>

REDIGERT: jeg har ikke sett noen spesifikasjon noe sted på at document.writeln skal skrive til slutt i DOM, jeg tror den skriver der den blir parset.

 

REDIGERT 2: i ditt siste eksempel så blir script tags seende slik ut:

<script type="text/javascript">
	document.writeln('<scr'+'ipt type="text/javascript">alert("text"+a+b);</scr'+'ipt>');
	var a = "alpha";
	b = "beta";  // var b = "beta"
</script>
<script type="text/javascript">alert("text"+a+b);</script>

Hvorfor dette skjer er litt interessant, og jeg har ikke svaret. Når du skriver b = "beta"; så er den implisitt global, og vil legges til som en property på det globale objektet (window). Meerkelig...

Endret av Enthroner
Lenke til kommentar

REDIGERT: jeg har ikke sett noen spesifikasjon noe sted på at document.writeln skal skrive til slutt i DOM, jeg tror den skriver der den blir parset.

Det har du visst rett i. Bortsett fra at den skriver etter script-taggen. Scriptet kan altså ikke skrive inni seg selv. Noe som angir at svaret på det originale spørsmålet mitt blir som L. sa, at det holder å parse én gang.

 

Men jeg klarer fortsatt ikke helt å få inn i skolten at dette viser det som det viser:

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		
		<script type="text/javascript">
			/*
				alert: text undefinedundefined
				alert: sist alphabeta
			*/
			document.writeln('<scr'+'ipt type="text/javascript">alert("text "+a+b);</scr'+'ipt>');
			var a = "alpha";
			var b = "beta";  // var b = "beta"
		</script>
		
		<script type="text/javascript">
			alert("sist " + a + b);
		</script>
		
	</head>
	<body>
	</body>
</html>
Det ekspanderes jo tross alt til:

<html><head>
		<title></title>
		
		<script type="text/javascript">
			/*
				alert: text undefinedundefined
				alert: sist alphabeta
			*/
			document.writeln('<scr'+'ipt type="text/javascript">alert("text "+a+b);</scr'+'ipt>');
			var a = "alpha";
			var b = "beta";  // var b = "beta"
		</script>
<script type="text/javascript">alert("text "+a+b);</script>
		
		<script type="text/javascript">
			alert("sist " + a + b);
		</script>
		
	</head>
	<body>
	

</body></html>
Endret av Emancipate
Lenke til kommentar

Men jeg klarer fortsatt ikke helt å få inn i skolten at dette viser det som det viser:

Jeg fant et svar. Inne i kallet til document.write kalles HTML-parseren opp for å ta seg av parameteret, den parser script-taggen, og dette kaller igjen opp js-motoren, som kjører scriptet (alert(...)), og på det tidspunktet er jo ikke a og b satt ennå.

 

Jeg er litt usikker på om dette egentlig er i henhold til spec eller en bug, men man kan se det ved å sette en alert() etter var b="beta"; Denne kjøres da etter (!) alerten i document.write().

 

I hvert fall får man i praksis atferd analogt til denne koden:

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		<script type="text/javascript">
			alert("ok" + a);  // fra document.write("<scr...
			alert("ikke ok" + b);  // fra document.write("<scr...
			var a = "alpha";
			b = "beta";
			alert("kommer aldri hit");
		</script>
	</head>
	<body>
	</body>
</html>
Variabler deklarert med var kan "brukes" før de er definert fordi de er oppdaget i en gjennomlesing før koden kjøres.

 

Det som er litt (veldig) snodig er at b="beta" (uten var) faktisk er implisitt window.b = "beta", men likevel er det ikke likt å lese fra udefinert b som å lese fra udefinert window.b!

 

<!DOCTYPE html>
<html>
	<head>
		<title></title>
		
		<script type="text/javascript">
			
			uten_var = "uten_var";
			alert("window." + window.uten_var);  // viser "uten_var"
			
			alert(window.blabla); // viser undefined
			alert(blabla); // error - viser ingenting
			
			
		</script>
	</head>
	<body>
	</body>
</html>
Lenke til kommentar

 

Da holder det å parse én gang og se at det er korrekt js. Men i det eval skal kjøres, må strengen parses før den kan evalueres.

Men det er jo å kalle enginen på nytt. Ingenting utenfor eval vil da parses.

 

Jepp, var bare for å påpeke min tolkning av spørsmålet.

 

Variabler deklarert med var kan "brukes" før de er definert fordi de er oppdaget i en gjennomlesing før koden kjøres.

Det kalles "hoisting", og kan være litt forvirrende i starten med javascript. Alle deklarasjoner av variabler skjer i praksis "i starten" av funksjonen, uansett når de faktisk er definert lenger nede i koden.

 

For å sitere MDN:

Because variable declarations (and declarations in general) are processed before any code is executed, declaring a variable anywhere in the code is equivalent to declaring it at the top. This also means that a variable can appear to be used before it's declared. This behavior is called "hoisting", as it appears that the variable declaration is moved to the top of the function or global code.

 

 

Det som er litt (veldig) snodig er at b="beta" (uten var) faktisk er implisitt window.b = "beta", men likevel er det ikke likt å lese fra udefinert b som å lese fra udefinert window.b!

 

Jepp, udaklerte variabler er globale, og kan derfor leses igjennom window objektet. Merk at dette aldri bør brukes i praksis, da det knekker alt om to kodesnutter tilfeldigvis bruker samme navn på to variable. Fra samme side på MDN

Assigning a value to an undeclared variable implicitly creates it as a global variable (it becomes a property of the global object) when the assignment is executed.

 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

 

Du har klart å oppdage mange av de spesielle tingene med javascript. Skal du programmere mye i JS anbefaler jeg å lese deg opp på en del slike ting, da det er *mange* slike overraskelser. :p

Endret av Matsemann
Lenke til kommentar

Det beste er selvfølgelig å unngå javascript 100% fordi det er en svulst av en teknologi og burde strengt tatt dø i morgen.

Ahahaha. Hvordan våger du å snakke om et av yndlingsspråkene mine på denne måten?

 

Skamme seg! (og når du skammer deg, les JavaScript: The Good Parts, kjøp deg et Espruino brett og start et Node.js prosjekt) :tease:

  • Liker 1
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...