-
Notifications
You must be signed in to change notification settings - Fork 0
/
scope.html
65 lines (54 loc) · 1.48 KB
/
scope.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Alcance</title>
<link rel="stylesheet" href="css/style.css" type="text/css">
</head>
<body>
<h1>Alcance</h1>
<div class="description">
El alcance de las variables puede ser confuso para muchos desarrolladores principiantes, y no tan principiantes.
La razón es porque JavaScript se parece un poco a un lenguaje de la familia de C.
<pre>
#include <stdio.h>
int main() {
int x = 1;
printf("%d, ", x); // 1
if (1) {
int x = 2;
printf("%d, ", x); // 2
}
printf("%d\n", x); // 1
}
</pre>
El resultado del programa sería 1, 2, 1, ya que C, así como el resto de la familia de C, tienen <strong>alcance de bloque</strong>
Esto no es el caso en JavaScript:
<pre>
var x = 1;
console.log(x); // 1
if (true) {
var x = 2;
console.log(x); // 2
}
console.log(x); // 2
</pre>
En éste caso, el resultado es 1, 2, 2. Esto es porque <strong>JavaScript sólo tiene alcance de función</strong>
Para muchos programadores acostumbrados a lenguajes como C, C++, C# o Java, ésto no es esperado. Afortunadamente tenemos la flexibilidad de las funciones, y hay un <em>workaround</em>(solución?). Si debes crear bloques temporales dentro de una función, puedes hacer lo siguiente:
<pre>
function foo() {
var x = 1;
if (x) {
(function () {
var x = 2;
// ...
}());
}
// x sigue siendo 1.
}
</pre>
</div>
<a class="source" href="js/scope.js">Código</a>
<script src="js/scope.js"></script>
</body>
</html>