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
The error message in most browsers does not give us much of a clue about what went wrong.
14
+
El mensaje de error en la mayoría de los navegadores no nos da una pista sobre lo que salió mal.
15
15
16
-
**The error appears because a semicolon is missing after`user = {...}`.**
16
+
**El error aparece porque falta un punto y coma después de`user = {...}`.**
17
17
18
-
JavaScript does not auto-insert a semicolon before a bracket `(user.go)()`, so it reads the code like:
18
+
JavaScript no inserta automáticamente un punto y coma antes de un paréntesis `(user.go)()`, por lo que lee el código así:
19
19
20
20
```js no-beautify
21
21
let user = { go:... }(user.go)()
22
22
```
23
23
24
-
Then we can also see that such a joint expression is syntactically a call of the object `{ go: ... }`as a function with the argument`(user.go)`. And that also happens on the same line with`let user`, so the `user`object has not yet even been defined, hence the error.
24
+
Entonces también podemos ver que tal expresión conjunta es sintácticamente una llamada del objeto `{ go: ... }`como una función con el argumento`(user.go)`. Y eso también ocurre en la misma línea con`let user`, por lo que el objeto `user`aún no se ha definido y de ahí el error.
25
25
26
-
If we insert the semicolon, all is fine:
26
+
Si insertamos el punto y coma todo está bien:
27
27
28
28
```js run
29
29
let user = {
@@ -34,4 +34,4 @@ let user = {
34
34
(user.go)() // John
35
35
```
36
36
37
-
Please note that parentheses around `(user.go)`do nothing here. Usually they setup the order of operations, but here the dot`.`works first anyway, so there's no effect. Only the semicolon thing matters.
37
+
Tenga en cuenta que los paréntesis alrededor de `(user.go)`no hacen nada aquí. Usualmente son configurados para ordenar las operaciones, pero aquí el punto`.`funciona primero de todas formas, por lo que no tienen ningún efecto en él. Solamente el punto y coma importa.
2. Lo mismo, aquí los paréntesis no cambian el orden de las operaciones, el punto es el primero de todos modos.
5
6
6
-
2. The same, parentheses do not change the order of operations here, the dot is first anyway.
7
-
8
-
3. Here we have a more complex call `(expression).method()`. The call works as if it were split into two lines:
7
+
3. Aquí tenemos una llamada más compleja `(expression).method()`. La llamada funciona como si se dividiera en dos líneas:
9
8
10
9
```js no-beautify
11
-
f =obj.go; //calculate the expression
12
-
f(); //call what we have
10
+
f =obj.go; //Calcula la expresión
11
+
f(); //Llama a lo que tenemos
13
12
```
14
13
15
-
Here `f()` is executed as a function, without `this`.
16
-
17
-
4. The similar thing as `(3)`, to the left of the dot `.` we have an expression.
14
+
Aquí `f()` se ejecuta como una función, sin `this`.
18
15
19
-
To explain the behavior of `(3)` and `(4)` we need to recall that property accessors (dot or square brackets) return a value of the Reference Type.
16
+
4. Lo mismo que `(3)`, a la izquierda del punto `.` tenemos una expresión.
20
17
21
-
Any operation on it except a method call (like assignment `=` or `||`) turns it into an ordinary value, which does not carry the information allowing to set `this`.
18
+
Para explicar el funcionamiento de `(3)` y `(4)` necesitamos recordar que los accesores de propiedad (punto o corchetes) devuelven un valor del Tipo de Referencia.
22
19
20
+
Cualquier operación en él excepto una llamada al método (como asignación `=` o `||`) lo convierte en un valor ordinario que no transporta la información que permite establecer `this`.
This article covers an advanced topic, to understand certain edge-cases better.
4
+
```warn header="Característica del lenguaje en profundidad"
5
+
Este artículo cubre un tema avanzado para comprender mejor ciertos casos límite.
6
6
7
-
It's not important. Many experienced developers live fine without knowing it. Read on if you're want to know how things work under the hood.
7
+
Esto no es importante. Muchos desarrolladores experimentados viven bien sin saberlo. Sigue leyendo si quieres saber cómo funcionan las cosas por debajo de la tapa.
8
8
```
9
9
10
-
A dynamically evaluated method call can lose`this`.
10
+
Una llamada al método evaluado dinámicamente puede perder`this`.
11
11
12
-
For instance:
12
+
Por ejemplo:
13
13
14
14
```js run
15
15
let user = {
@@ -18,42 +18,42 @@ let user = {
18
18
bye() { alert("Bye"); }
19
19
};
20
20
21
-
user.hi(); //works
21
+
user.hi(); //Funciona
22
22
23
-
//now let's call user.hi or user.bye depending on the name
23
+
//Ahora llamemos a user.hi o user.bye dependiendo del nombre ingresado
24
24
*!*
25
-
(user.name=="John"?user.hi:user.bye)(); // Error!
25
+
(user.name=="John"?user.hi:user.bye)(); //¡Error!
26
26
*/!*
27
27
```
28
28
29
-
On the last line there is a conditional operator that chooses either `user.hi`or`user.bye`. In this case the result is`user.hi`.
29
+
En la última linea hay un operador condicional que elije entre `user.hi`o`user.bye`. En este caso el resultado es`user.hi`.
30
30
31
-
Then the method is immediately called with parentheses `()`. But it doesn't work correctly!
31
+
Entonces el método es llamado con paréntesis `()`. ¡Pero esto no funciona correctamente!
32
32
33
-
As you can see, the call results in an error, because the value of`"this"`inside the call becomes`undefined`.
33
+
Como puedes ver, la llamada resulta en un error porque el valor de`"this"`dentro de la llamada se convierte en`undefined`.
34
34
35
-
This works (object dot method):
35
+
Esto funciona (objeto, punto, método):
36
36
```js
37
37
user.hi();
38
38
```
39
39
40
-
This doesn't (evaluated method):
40
+
Esto no funciona (método evaluado):
41
41
```js
42
-
(user.name=="John"?user.hi:user.bye)(); // Error!
42
+
(user.name=="John"?user.hi:user.bye)(); //¡Error!
43
43
```
44
44
45
-
Why? If we want to understand why it happens, let's get under the hood of how `obj.method()` call works.
45
+
¿Por qué? Si queremos entender por qué pasa esto vayamos bajo la tapa de cómo funciona la llamada `obj.method()`.
46
46
47
-
## Reference type explained
47
+
## Tipo de Referencia explicado
48
48
49
-
Looking closely, we may notice two operations in `obj.method()` statement:
49
+
Mirando de cerca podemos notar dos operaciones en la declaración `obj.method()`:
50
50
51
-
1.First, the dot `'.'` retrieves the property`obj.method`.
52
-
2.Then parentheses `()`execute it.
51
+
1.Primero, el punto '.'recupera la propiedad de`obj.method`.
52
+
2.Luego el paréntesis `()`lo ejecuta.
53
53
54
-
So, how does the information about `this`get passed from the first part to the second one?
54
+
Entonces ¿cómo es trasladada la información de `this`de la primera parte a la segunda?
55
55
56
-
If we put these operations on separate lines, then`this`will be lost for sure:
56
+
Si ponemos estas operaciones en líneas separadas, entonces`this`se perderá con seguridad:
57
57
58
58
```js run
59
59
let user = {
@@ -62,53 +62,53 @@ let user = {
62
62
}
63
63
64
64
*!*
65
-
//split getting and calling the method in two lines
65
+
//Se divide la obtención y se llama al método en dos lineas
66
66
let hi =user.hi;
67
-
hi(); // Error, because this is undefined
67
+
hi(); // Error porque this es indefinido
68
68
*/!*
69
69
```
70
70
71
-
Here`hi = user.hi`puts the function into the variable, and then on the last line it is completely standalone, and so there's no `this`.
71
+
Aquí`hi = user.hi`coloca la función dentro de una variable y luego la última linea es completamente independiente, por lo tanto no hay`this`.
72
72
73
-
**To make `user.hi()`calls work, JavaScript uses a trick -- the dot `'.'`returns not a function, but a value of the special [Reference Type](https://tc39.github.io/ecma262/#sec-reference-specification-type).**
73
+
**Para hacer que la llamada `user.hi()`funcione, JavaScript usa un truco: el punto `'.'`no devuelve una función, sino un valor especial del [Tipo de referencia](https://tc39.github.io/ecma262/#sec-reference-specification-type).**
74
74
75
-
The Reference Type is a "specification type". We can't explicitly use it, but it is used internally by the language.
75
+
El Tipo de Referencia es un "tipo de especificación". No podemos usarla explícitamente pero es usada internamente por el lenguaje.
76
76
77
-
The value of Reference Type is a three-value combination `(base, name, strict)`, where:
77
+
El valor del Tipo de Referencia es una combinación de triple valor `(base, name, strict)`, donde:
78
78
79
-
-`base`is the object.
80
-
-`name`is the property name.
81
-
-`strict`is true if`use strict`is in effect.
79
+
-`base`es el objeto.
80
+
-`name`es el nombre de la propiedad.
81
+
-`strict`es verdadero si`use strict`está en efecto.
82
82
83
-
The result of a property access`user.hi`is not a function, but a value of Reference Type. For`user.hi`in strict mode it is:
83
+
El resultado de un acceso a la propiedad`user.hi`no es una función, sino un valor de Tipo de Referencia. Para`user.hi`en modo estricto esto es:
84
84
85
85
```js
86
-
//Reference Type value
86
+
//Valor de Tipo de Referencia
87
87
(user, "hi", true)
88
88
```
89
89
90
-
When parentheses `()`are called on the Reference Type, they receive the full information about the object and its method, and can set the right `this` (`=user`in this case).
90
+
Cuando son llamados los paréntesis `()`en el tipo de referencia, reciben la información completa sobre el objeto y su método y pueden establecer el `this`correcto (`=user`en este caso).
91
91
92
-
Reference type is a special "intermediary" internal type, with the purpose to pass information from dot `.`to calling parentheses`()`.
92
+
Tipo de Referencia es un tipo interno de "intermediario", con el propósito de pasar información desde el punto `.`hacia los paréntesis de la llamada`()`.
93
93
94
-
Any other operation like assignment `hi = user.hi`discards the reference type as a whole, takes the value of`user.hi` (a function) and passes it on. So any further operation "loses" `this`.
94
+
Cualquier otra operación como la asignación `hi = user.hi`descarta el tipo de referencia como un todo, toma el valor de`user.hi` (una función) y lo pasa. Entonces cualquier operación "pierde" `this`.
95
95
96
-
So, as the result, the value of`this`is only passed the right way if the function is called directly using a dot `obj.method()`or square brackets `obj['method']()`syntax (they do the same here). Later in this tutorial, we will learn various ways to solve this problem such as[func.bind()](/bind#solution-2-bind).
96
+
Entonces, como resultado, el valor de`this`solo se pasa de la manera correcta si la función se llama directamente usando una sintaxis de punto `obj.method()`o corchetes `obj['method']()`(aquí hacen lo mismo). Más adelante en este tutorial, aprenderemos varias formas de resolver este problema así como[func.bind()](/bind#solution-2-bind).
97
97
98
-
## Summary
98
+
## Resumen
99
99
100
-
Reference Type is an internal type of the language.
100
+
El Tipo de Referencia es un tipo interno del lenguaje.
101
101
102
-
Reading a property, such as with dot `.`in`obj.method()`returns not exactly the property value, but a special "reference type" value that stores both the property value and the object it was taken from.
102
+
Leer una propiedad como las que tienen un punto `.`en`obj.method()`no devuelve exactamente el valor de la propiedad, sino un valor especial de "tipo de referencia" que almacena tanto el valor de la propiedad como el objeto del que se tomó.
103
103
104
-
That's for the subsequent method call`()`to get the object and set `this`to it.
104
+
Eso se hace para la llamada`()`al siguiente método para obtener el objeto y establecer `this`en él.
105
105
106
-
For all other operations, the reference type automatically becomes the property value (a function in our case).
106
+
Para todas las demás operaciones, el tipo de referencia se convierte automáticamente en el valor de la propiedad (una función en nuestro caso).
107
107
108
-
The whole mechanics is hidden from our eyes. It only matters in subtle cases, such as when a method is obtained dynamically from the object, using an expression.
108
+
Toda la mecánica está oculta a nuestros ojos. Solo importa en casos sutiles, como cuando un método se obtiene dinámicamente del objeto, usando una expresión.
109
109
110
110
111
111
112
112
113
113
114
-
result of dot`.`isn't actually a method, but a value of `` needs a way to pass the information about`obj`
114
+
El resultado del punto`.`no es en realidad un método, pero un valor de `` necesita una manera de pasar la información sobre`obj`.
0 commit comments