You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
```smart header="This article is for understanding old scripts"
5
-
The information in this article is useful for understanding old scripts.
4
+
```smart header="Den artikel er primært for at forstå ældre scripts"
5
+
Informationen i denne artikel er brugbar for at forstå ældre scripts.
6
6
7
-
That's not how we write new code.
7
+
Det er ikke noget man normalt bruger i moderne JavaScript.
8
8
```
9
9
10
-
In the very first chapter about [variables](info:variables), we mentioned three ways of variable declaration:
10
+
I det første kapitel omkring [variable](info:variables), nævnte vi tre måder at deklarere variable:
11
11
12
12
1.`let`
13
13
2.`const`
14
14
3.`var`
15
15
16
-
The`var`declaration is similar to `let`. Most of the time we can replace `let`by`var`or vice-versa and expect things to work:
16
+
Deklerationen`var`minder meget om `let`. I langt de fleste tilfælde kan vi erstatte `let`med`var`eller omvendt og forvente, at tingene virker som de skal:
17
17
18
18
```js run
19
-
var message ="Hi";
20
-
alert(message); //Hi
19
+
var message ="Hej";
20
+
alert(message); //Hej
21
21
```
22
22
23
-
But internally `var`is a very different beast, that originates from very old times. It's generally not used in modern scripts, but still lurks in the old ones.
23
+
Men internt er `var`en helt anden størrelse, der har sin oprindelse i JavaScript tidlige år. Det bruges normalt ikke i moderne JavaScript, men vil stadig ofte findes i ældre scripts.
24
24
25
-
If you don't plan on meeting such scripts you may even skip this chapter or postpone it.
25
+
Hvis du ikke planlægger at møde sådanne scripts, kan du måske springe dette kapitel over eller udsætte det.
26
26
27
-
On the other hand, it's important to understand differences when migrating old scripts from`var`to`let`, to avoid odd errors.
27
+
På den anden side er det vigtigt at forstå forskellene, når man migrerer gamle scripts fra`var`til`let`, for at undgå sjældne fejl.
28
28
29
-
## "var" has no block scope
29
+
## "var" har ingen block scope
30
30
31
-
Variables, declared with`var`, are either function-scoped or global-scoped. They are visible through blocks.
31
+
Variable deklareret med`var` er enten function-scoped eller global-scoped. De er synlige gennem kodeblokke.
32
32
33
-
For instance:
33
+
For eksempel:
34
34
35
35
```js run
36
36
if (true) {
37
-
var test =true; //use "var" instead of "let"
37
+
var test =true; //bruger "var" i stedet for "let"
38
38
}
39
39
40
40
*!*
41
-
alert(test); // true, the variable lives after if
41
+
alert(test); // true, variablen lever efter if er afsluttet
42
42
*/!*
43
43
```
44
44
45
-
As`var`ignores code blocks, we've got a global variable`test`.
45
+
Da`var`ignorerer kodeblokke får vi her en global variabel`test`.
46
46
47
-
If we used`let test`instead of `var test`, then the variable would only be visible inside`if`:
47
+
Hvis vi bruger`let test`i stedet for `var test`, så vil variablen kun være synlig inden for`if`:
48
48
49
49
```js run
50
50
if (true) {
51
-
let test =true; //use "let"
51
+
let test =true; //bruger "let"
52
52
}
53
53
54
54
*!*
55
55
alert(test); // ReferenceError: test is not defined
56
56
*/!*
57
57
```
58
58
59
-
The same thing for loops: `var`cannot be block- or loop-local:
59
+
Den samme ting gælder for løkker: `var`kan ikke være lokal for løkken:
60
60
61
61
```js run
62
62
for (var i =0; i <10; i++) {
@@ -65,59 +65,59 @@ for (var i = 0; i < 10; i++) {
65
65
}
66
66
67
67
*!*
68
-
alert(i); // 10, "i" is visible after loop, it's a global variable
69
-
alert(one); // 1, "one" is visible after loop, it's a global variable
68
+
alert(i); // 10, "i" er synlig efter loopet da det (med var) er blevet en global variabel
69
+
alert(one); // 1, "one" er synlig efter loopet da det (med var) er blevet en global variabel
70
70
*/!*
71
71
```
72
72
73
-
If a code block is inside a function, then `var`becomes a function-level variable:
73
+
Hvis en kodeblok er inde i en funktion så bliver `var`en variabel med et scope til funktionen. Den er synlig i hele funktionen, uanset hvor den er deklareret:
74
74
75
75
```js run
76
76
functionsayHi() {
77
77
if (true) {
78
-
var phrase ="Hello";
78
+
var phrase ="Hej";
79
79
}
80
80
81
-
alert(phrase); //works
81
+
alert(phrase); //virker
82
82
}
83
83
84
84
sayHi();
85
85
alert(phrase); // ReferenceError: phrase is not defined
86
86
```
87
87
88
-
As we can see, `var`pierces through`if`, `for`or other code blocks. That's because a long time ago in JavaScript, blocks had no Lexical Environments, and`var`is a remnant of that.
88
+
Som vi kan se så skærer `var`sig gennem`if`, `for`og andre kodeblokke. Det er fordi JavaScript i gamle dage ikke havde leksikale miljøer for kodeblokke og`var`er et barn af den tid.
89
89
90
-
## "var" tolerates redeclarations
90
+
## "var" tolererer redeklerationer
91
91
92
-
If we declare the same variable with`let`twice in the same scope, that's an error:
92
+
Hvis vi deklarerer den samme variabel med`let`to gange i samme scope, får vi en fejl:
93
93
94
94
```js run
95
95
let user;
96
96
let user; // SyntaxError: 'user' has already been declared
97
97
```
98
98
99
-
With`var`, we can redeclare a variable any number of times. If we use`var`with an already-declared variable, it's just ignored:
99
+
Med`var` kan vi redeklarere en variabel så meget vi har lyst. Hvis vi bruger`var`med en allerede deklareret variabel, ignoreres det bare:
100
100
101
101
```js run
102
102
var user ="Pete";
103
103
104
-
var user ="John"; //this "var" does nothing (already declared)
105
-
// ...it doesn't trigger an error
104
+
var user ="John"; //denne "var" gør intet (er allerede deklareret), så den ignoreres
105
+
// ...derfor melder JavaScript ikke en fejl
106
106
107
107
alert(user); // John
108
108
```
109
109
110
-
## "var" variables can be declared below their use
110
+
## "var" variable kan deklareres efter de bruges
111
111
112
-
`var`declarations are processed when the function starts (or script starts for globals).
112
+
`var`deklaration processeres først når funktionen kaldes (eller scriptet starter for globale variable).
113
113
114
-
In other words, `var` variables are defined from the beginning of the function, no matter where the definition is (assuming that the definition is not in the nested function).
114
+
Sagt på en anden måde. Variable skabt med `var` er defineret fra begyndelsen af funktionen, lige meget hvor i funktionen definitionen er (med mindre definitionen er i en indlejret funktion selvfølgelig).
115
115
116
-
So this code:
116
+
Så denne kode:
117
117
118
118
```js run
119
119
functionsayHi() {
120
-
phrase ="Hello";
120
+
phrase ="Hej";
121
121
122
122
alert(phrase);
123
123
@@ -128,26 +128,26 @@ function sayHi() {
128
128
sayHi();
129
129
```
130
130
131
-
...Is technically the same as this (moved`var phrase`above):
131
+
...er teksnisk set det samme som denne (flyttet`var phrase`over):
132
132
133
133
```js run
134
134
functionsayHi() {
135
135
*!*
136
136
var phrase;
137
137
*/!*
138
138
139
-
phrase ="Hello";
139
+
phrase ="Hej";
140
140
141
141
alert(phrase);
142
142
}
143
143
sayHi();
144
144
```
145
145
146
-
...Or even as this (remember, code blocks are ignored):
146
+
...eller endda denne her (husk, at kodeblokke ignoreres af `var`):
147
147
148
148
```js run
149
149
functionsayHi() {
150
-
phrase ="Hello"; // (*)
150
+
phrase ="Hej"; // (*)
151
151
152
152
*!*
153
153
if (false) {
@@ -160,128 +160,128 @@ function sayHi() {
160
160
sayHi();
161
161
```
162
162
163
-
People also call such behavior "hoisting" (raising), because all`var`are "hoisted" (raised) to the top of the function.
163
+
Denne adfærd kaldes "hoisting" (hejsning eller opløftning), fordi alle`var`bliver "hoisted" (løftet) op til toppen af funktionen.
164
164
165
-
So in the example above, `if (false)` branch never executes, but that doesn't matter. The`var`inside it is processed in the beginning of the function, so at the moment of `(*)`the variable exists.
165
+
Så i eksemplet ovenfor, `if (false)` branch bliver egentlig aldrig eksekveret, men det spiller ingen rolle. Den`var`der er inde i den bliver behandlet i begyndelsen af funktionen, så ved tidspunktet for `(*)`eksisterer variablen.
166
166
167
-
**Declarations are hoisted, but assignments are not.**
167
+
**Deklarationer bliver hoisted men tildelinger bliver ikke.**
168
168
169
-
That's best demonstrated with an example:
169
+
Det er nok bedst demonstreret med et eksempel, hvor vi prøver at bruge en variabel før den er deklareret:
170
170
171
171
```js run
172
172
functionsayHi() {
173
173
alert(phrase);
174
174
175
175
*!*
176
-
var phrase ="Hello";
176
+
var phrase ="Hej";
177
177
*/!*
178
178
}
179
179
180
180
sayHi();
181
181
```
182
182
183
-
The line `var phrase = "Hello"`has two actions in it:
183
+
Linjen `var phrase = "Hej"`har to handlinger knyttet til sig:
184
184
185
-
1.Variable declaration`var`
186
-
2.Variable assignment`=`.
185
+
1.Deklaration af variablen`var`
186
+
2.Tildeling af værdi`=`.
187
187
188
-
The declaration is processed at the start of function execution ("hoisted"), but the assignment always works at the place where it appears. So the code works essentially like this:
188
+
Deklarationen processeres i starten af funktionens eksekvering ("hoisted"), men tildelingen virker altid på den sted hvor den optræder. Så koden virker faktisk som dette:
189
189
190
190
```js run
191
191
functionsayHi() {
192
192
*!*
193
-
var phrase; //declaration works at the start...
193
+
var phrase; //deklaration virker fra starten...
194
194
*/!*
195
195
196
196
alert(phrase); // undefined
197
197
198
198
*!*
199
-
phrase ="Hello"; // ...assignment - when the execution reaches it.
199
+
phrase ="Hej"; // ...tildeling - når afviklingen rammer dette sted.
200
200
*/!*
201
201
}
202
202
203
203
sayHi();
204
204
```
205
205
206
-
Because all`var`declarations are processed at the function start, we can reference them at any place. But variables are undefined until the assignments.
206
+
Fordi alle`var`deklarationer behandles i starten af funktionens eksekvering, kan vi referere til dem hvor som helst. Men variabler er undefined indtil tildelingen.
207
207
208
-
In both examples above, `alert`runs without an error, because the variable `phrase`exists. But its value is not yet assigned, so it shows`undefined`.
208
+
I begge eksempler ovenfor, kører `alert`uden en fejl, fordi variablen `phrase`eksisterer. Men dens værdi er ikke endnu tildelt, så den viser`undefined`.
209
209
210
210
## IIFE
211
211
212
-
In the past, as there was only`var`, and it has no block-level visibility, programmers invented a way to emulate it. What they did was called "immediately-invoked function expressions" (abbreviated as IIFE).
212
+
I begyndelsen, da der kun var`var`, og det ikke havde synlighed på blokniveau, opfandt programmører en måde at emulere det. Det de gjorde, kaldtes "immediately-invoked function expressions" (forkortet som IIFE).
213
213
214
-
That's not something we should use nowadays, but you can find them in old scripts.
214
+
Det er ikke noget der er udbredt mere, men du vil stadig kunne finde det i kode fra tid til anden.
215
215
216
-
An IIFE looks like this:
216
+
En IIFE ser således ud:
217
217
218
218
```js run
219
219
(function() {
220
220
221
-
var message ="Hello";
221
+
var message ="Hej";
222
222
223
-
alert(message); //Hello
223
+
alert(message); //Hej
224
224
225
225
})();
226
226
```
227
227
228
-
Here, a Function Expression is created and immediately called. So the code executes right away and has its own private variables.
228
+
Her bliver et funktionsudtryk skabt og kaldt med det samme. På den måde bliver koden afviklet med sine egne private variable.
229
229
230
-
The Function Expression is wrapped with parenthesis `(function {...})`, because when JavaScript engine encounters`"function"`in the main code, it understands it as the start of a Function Declaration. But a Function Declaration must have a name, so this kind of code will give an error:
230
+
Funktionsudtrykket er pakket ind i parentes `(function {...})`, fordi når JavaScript-motoren støder på`"function"`i hovedkoden, så forstår den det som starten af en funktionsdeklaration. Men en funktionsdeklaration skal have et navn, så denne type kode vil give en fejl:
231
231
232
232
```js run
233
-
//Tries to declare and immediately call a function
233
+
//Prøver at oprette og kalde en funktion med det samme
234
234
function() { // <-- SyntaxError: Function statements require a function name
235
235
236
-
var message ="Hello";
236
+
var message ="Hej";
237
237
238
-
alert(message); //Hello
238
+
alert(message); //Hej
239
239
240
240
}();
241
241
```
242
242
243
-
Even if we say: "okay, let's add a name", that won't work, as JavaScript does not allow Function Declarations to be called immediately:
243
+
Selv hvis vi siger: "Okay, lad os give den et navn!", vil det ikke virke da JavaScript ikke tillader at funktionsudtryk kaldes med det samme de er skabt:
244
244
245
245
```js run
246
-
//syntax error because of parentheses below
246
+
//syntaksfejl på grund af parenteser til sidst
247
247
functiongo() {
248
248
249
-
}(); // <-- can't call Function Declaration immediately
249
+
}(); // <-- du kan ikke kalde den med det samme
250
250
```
251
251
252
-
So, the parentheses around the function is a trick to show JavaScript that the function is created in the context of another expression, and hence it's a Function Expression: it needs no name and can be called immediately.
252
+
Så parenteser rundt om funktionensudtrykket er et trick, for at vise JavaScript at funktionen er skabt i konteksten af et andet udtryk, og derfor er den et funktionsudtryk: det behøver ikke et navn og kan kaldes med det samme.
253
253
254
-
There exist other ways besides parentheses to tell JavaScript that we mean a Function Expression:
254
+
Der findes andre måder end parenteser til at fortælle JavaScript at vi mener et funktionsudtryk:
255
255
256
256
```js run
257
257
// Ways to create IIFE
258
258
259
259
*!*(*/!*function() {
260
-
alert("Parentheses around the function");
260
+
alert("Parenteser omkring funktionen");
261
261
}*!*)*/!*();
262
262
263
263
*!*(*/!*function() {
264
-
alert("Parentheses around the whole thing");
264
+
alert("Parenteser omkring hele udtrykket");
265
265
}()*!*)*/!*;
266
266
267
267
*!*!*/!*function() {
268
-
alert("Bitwise NOT operator starts the expression");
268
+
alert("Bitwise NOT operator starter udtrykket");
269
269
}();
270
270
271
271
*!*+*/!*function() {
272
-
alert("Unary plus starts the expression");
272
+
alert("Unært plus starter udtrykket");
273
273
}();
274
274
```
275
275
276
-
In all the above cases we declare a Function Expression and run it immediately. Let's note again: nowadays there's no reason to write such code.
276
+
I alle tilfælde ovenfor deklareres et funktionsudtryk og kaldes med det samme. Men, i dag er der sjældent grund til at skrive sådan kode efter vi har fået `let` og `const`.
277
277
278
-
## Summary
278
+
## Opsummering
279
279
280
-
There are two main differences of `var`compared to`let/const`:
280
+
Der er to hovedforskelle mellem `var`og`let/const`:
281
281
282
-
1.`var`variables have no block scope, their visibility is scoped to current function, or global, if declared outside function.
283
-
2.`var`declarations are processed at function start (script start for globals).
282
+
1.`var`variabler har ingen blok-scope, deres synlighed er scoped til den aktuelle funktion, eller globalt, hvis de er deklareret uden for en funktion.
283
+
2.`var`deklarationer behandles i starten af funktionens eksekvering (script start for globale variabler).
284
284
285
-
There's one more very minor difference related to the global object, that we'll cover in the next chapter.
285
+
Der er yderligere en lille ekstra forskel relateret til det globale objekt, som vi vil dække i næste kapitel.
286
286
287
-
These differences make `var`worse than`let`most of the time. Block-level variables is such a great thing. That's why `let`was introduced in the standard long ago, and is now a major way (along with`const`) to declare a variable.
287
+
Det er disse forskelle der gør `var`værre end`let`de fleste gange. Blok-niveau variabler er sådan en god ting. Det er derfor `let`blev introduceret i standarden for længe siden, og er nu en vigtig måde (sammen med`const`) at deklarere en variabel på.
0 commit comments