Skip to content

Commit 9124ad1

Browse files
authored
Merge pull request #248 from ockley/master
The old "var"
2 parents d1dfc43 + 838953d commit 9124ad1

File tree

1 file changed

+79
-79
lines changed

1 file changed

+79
-79
lines changed
Lines changed: 79 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,62 @@
11

2-
# The old "var"
2+
# Den gamle "var"
33

4-
```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.
66
7-
That's not how we write new code.
7+
Det er ikke noget man normalt bruger i moderne JavaScript.
88
```
99

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:
1111

1212
1. `let`
1313
2. `const`
1414
3. `var`
1515

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:
1717

1818
```js run
19-
var message = "Hi";
20-
alert(message); // Hi
19+
var message = "Hej";
20+
alert(message); // Hej
2121
```
2222

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.
2424

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.
2626

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.
2828

29-
## "var" has no block scope
29+
## "var" har ingen block scope
3030

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.
3232

33-
For instance:
33+
For eksempel:
3434

3535
```js run
3636
if (true) {
37-
var test = true; // use "var" instead of "let"
37+
var test = true; // bruger "var" i stedet for "let"
3838
}
3939

4040
*!*
41-
alert(test); // true, the variable lives after if
41+
alert(test); // true, variablen lever efter if er afsluttet
4242
*/!*
4343
```
4444

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`.
4646

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`:
4848

4949
```js run
5050
if (true) {
51-
let test = true; // use "let"
51+
let test = true; // bruger "let"
5252
}
5353

5454
*!*
5555
alert(test); // ReferenceError: test is not defined
5656
*/!*
5757
```
5858

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:
6060

6161
```js run
6262
for (var i = 0; i < 10; i++) {
@@ -65,59 +65,59 @@ for (var i = 0; i < 10; i++) {
6565
}
6666

6767
*!*
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
7070
*/!*
7171
```
7272

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:
7474

7575
```js run
7676
function sayHi() {
7777
if (true) {
78-
var phrase = "Hello";
78+
var phrase = "Hej";
7979
}
8080

81-
alert(phrase); // works
81+
alert(phrase); // virker
8282
}
8383

8484
sayHi();
8585
alert(phrase); // ReferenceError: phrase is not defined
8686
```
8787

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.
8989

90-
## "var" tolerates redeclarations
90+
## "var" tolererer redeklerationer
9191

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:
9393

9494
```js run
9595
let user;
9696
let user; // SyntaxError: 'user' has already been declared
9797
```
9898

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:
100100

101101
```js run
102102
var user = "Pete";
103103

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
106106

107107
alert(user); // John
108108
```
109109

110-
## "var" variables can be declared below their use
110+
## "var" variable kan deklareres efter de bruges
111111

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).
113113

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).
115115

116-
So this code:
116+
Så denne kode:
117117

118118
```js run
119119
function sayHi() {
120-
phrase = "Hello";
120+
phrase = "Hej";
121121

122122
alert(phrase);
123123

@@ -128,26 +128,26 @@ function sayHi() {
128128
sayHi();
129129
```
130130

131-
...Is technically the same as this (moved `var phrase` above):
131+
...er teksnisk set det samme som denne (flyttet `var phrase` over):
132132

133133
```js run
134134
function sayHi() {
135135
*!*
136136
var phrase;
137137
*/!*
138138

139-
phrase = "Hello";
139+
phrase = "Hej";
140140

141141
alert(phrase);
142142
}
143143
sayHi();
144144
```
145145

146-
...Or even as this (remember, code blocks are ignored):
146+
...eller endda denne her (husk, at kodeblokke ignoreres af `var`):
147147

148148
```js run
149149
function sayHi() {
150-
phrase = "Hello"; // (*)
150+
phrase = "Hej"; // (*)
151151

152152
*!*
153153
if (false) {
@@ -160,128 +160,128 @@ function sayHi() {
160160
sayHi();
161161
```
162162

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.
164164

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.
166166

167-
**Declarations are hoisted, but assignments are not.**
167+
**Deklarationer bliver hoisted men tildelinger bliver ikke.**
168168

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:
170170

171171
```js run
172172
function sayHi() {
173173
alert(phrase);
174174

175175
*!*
176-
var phrase = "Hello";
176+
var phrase = "Hej";
177177
*/!*
178178
}
179179

180180
sayHi();
181181
```
182182

183-
The line `var phrase = "Hello"` has two actions in it:
183+
Linjen `var phrase = "Hej"` har to handlinger knyttet til sig:
184184

185-
1. Variable declaration `var`
186-
2. Variable assignment `=`.
185+
1. Deklaration af variablen `var`
186+
2. Tildeling af værdi `=`.
187187

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:
189189

190190
```js run
191191
function sayHi() {
192192
*!*
193-
var phrase; // declaration works at the start...
193+
var phrase; // deklaration virker fra starten...
194194
*/!*
195195

196196
alert(phrase); // undefined
197197

198198
*!*
199-
phrase = "Hello"; // ...assignment - when the execution reaches it.
199+
phrase = "Hej"; // ...tildeling - når afviklingen rammer dette sted.
200200
*/!*
201201
}
202202

203203
sayHi();
204204
```
205205

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.
207207

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`.
209209

210210
## IIFE
211211

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).
213213

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.
215215

216-
An IIFE looks like this:
216+
En IIFE ser således ud:
217217

218218
```js run
219219
(function() {
220220

221-
var message = "Hello";
221+
var message = "Hej";
222222

223-
alert(message); // Hello
223+
alert(message); // Hej
224224

225225
})();
226226
```
227227

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.
229229

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:
231231

232232
```js run
233-
// Tries to declare and immediately call a function
233+
// Prøver at oprette og kalde en funktion med det samme
234234
function() { // <-- SyntaxError: Function statements require a function name
235235

236-
var message = "Hello";
236+
var message = "Hej";
237237

238-
alert(message); // Hello
238+
alert(message); // Hej
239239

240240
}();
241241
```
242242

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:
244244

245245
```js run
246-
// syntax error because of parentheses below
246+
// syntaksfejl på grund af parenteser til sidst
247247
function go() {
248248

249-
}(); // <-- can't call Function Declaration immediately
249+
}(); // <-- du kan ikke kalde den med det samme
250250
```
251251

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.
253253

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:
255255

256256
```js run
257257
// Ways to create IIFE
258258

259259
*!*(*/!*function() {
260-
alert("Parentheses around the function");
260+
alert("Parenteser omkring funktionen");
261261
}*!*)*/!*();
262262

263263
*!*(*/!*function() {
264-
alert("Parentheses around the whole thing");
264+
alert("Parenteser omkring hele udtrykket");
265265
}()*!*)*/!*;
266266

267267
*!*!*/!*function() {
268-
alert("Bitwise NOT operator starts the expression");
268+
alert("Bitwise NOT operator starter udtrykket");
269269
}();
270270

271271
*!*+*/!*function() {
272-
alert("Unary plus starts the expression");
272+
alert("Unært plus starter udtrykket");
273273
}();
274274
```
275275

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`.
277277

278-
## Summary
278+
## Opsummering
279279

280-
There are two main differences of `var` compared to `let/const`:
280+
Der er to hovedforskelle mellem `var` og `let/const`:
281281

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).
284284

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.
286286

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

Comments
 (0)