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
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/04-var/article.md
+28-17Lines changed: 28 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -13,27 +13,18 @@ In the very first chapter about [variables](info:variables), we mentioned three
13
13
2.`const`
14
14
3.`var`
15
15
16
-
`let` and `const` behave exactly the same way in terms of Lexical Environments.
17
-
18
-
But `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.
19
-
20
-
If you don't plan on meeting such scripts you may even skip this chapter or postpone it, but then there's a chance that it bites you later.
21
-
22
-
From the first sight, `var` behaves similar to `let`. That is, declares a variable:
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:
23
17
24
18
```js run
25
-
functionsayHi() {
26
-
var phrase ="Hello"; // local variable, "var" instead of "let"
27
-
28
-
alert(phrase); // Hello
29
-
}
19
+
var message ="Hi";
20
+
alert(message); // Hi
21
+
```
30
22
31
-
sayHi();
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.
32
24
33
-
alert(phrase); // Error, phrase is not defined
34
-
```
25
+
If you don't plan on meeting such scripts you may even skip this chapter or postpone it.
35
26
36
-
...But here are the differences.
27
+
On the other hand, it's important to understand differences when migrating old scripts from `var` to `let`, to avoid odd errors.
37
28
38
29
## "var" has no block scope
39
30
@@ -94,7 +85,27 @@ alert(phrase); // Error: phrase is not defined (Check the Developer Console)
94
85
95
86
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.
96
87
97
-
## "var" declarations are processed at the function start
88
+
## "var" tolerates redeclarations
89
+
90
+
If we declare the same variable with `let` twice in the same scope, that's an error:
91
+
92
+
```js run
93
+
let user;
94
+
let user; // SyntaxError: 'user' has already been declared
95
+
```
96
+
97
+
With `var`, we can redeclare a variable any number of times. If we use `var` with an already-declared variable, it's just ignored:
98
+
99
+
```js run
100
+
var user ="Pete";
101
+
102
+
var user ="John"; // this "var" does nothing (already declared)
103
+
// ...it doesn't trigger an error
104
+
105
+
alert(user); // John
106
+
```
107
+
108
+
## "var" variables can be declared below their use
98
109
99
110
`var` declarations are processed when the function starts (or script starts for globals).
0 commit comments