Guías de Make it Real
  • Introduction
  • Preparación
    • Conceptos básicos
    • El editor de texto
    • La línea de comandos
    • Git y Github
  • Git
    • Instalación y configuración
    • Conceptos y comandos esenciales
    • Ignorando archivos y carpetas
    • Trabajando con ramas
    • Repositorios remotos
    • Etiquetas
    • Reescribiendo la historia
    • Stashing
    • Github
  • HTML y CSS
    • Introducción a HTML
    • Introducción a CSS
    • Más elementos de HTML
    • Tablas
    • Formularios
    • El modelo de caja en CSS
    • Fondos (backgrounds)
    • Posicionamiento
    • Selectores CSS
    • Bordes, sombras y gradientes
    • Media Queries
    • Unidades en CSS
    • Flexbox
  • Bootstrap 3
    • Primeros pasos
    • Elementos básicos de HTML
    • Componentes
    • La grilla
    • Personalizando Bootstrap
    • Utilizando plantillas
  • Bootstrap 4
    • Primeros pasos
    • Elementos básicos de HTML
    • Componentes
    • La grilla
    • Clases utilitarias
    • Personalizando Bootstrap
  • Ruby
    • Primeros pasos
    • Tipos y operadores
    • Variables y entrada de usuario
    • Condicionales
    • Ciclos
    • Arreglos
    • Más cadenas de texto
    • Hashes
    • Métodos
    • Manipulación de archivos
    • Gemas
  • Programación Orientada a Objetos en Ruby
    • Clases y objetos
    • Métodos y atributos de clase
    • Herencia
    • Módulos
    • Excepciones
  • JavaScript I
    • Primeros pasos
    • Tipos y operadores
    • Variables
    • Condicionales
    • Ciclos
    • Arreglos
    • Más cadenas de texto
    • Funciones
    • Objetos literales
    • Manipulación de archivos
  • JavaScript en el navegador
    • Primeros pasos
    • Manipulando HTML
    • Escuchando eventos
    • Local Storage
    • History API
    • Canvas
    • Notificaciones Web
    • Audio y Video
    • Arrastrar y soltar
    • JSON
    • Realizando peticiones HTTP
  • jQuery
    • Primeros pasos
    • Manipulando HTML
    • Escuchando eventos
    • Plugins
    • Realizando peticiones con AJAX
  • JavaScript II
    • Prototipos
    • Librerías (Node.js)
    • ES6
    • Uso de this (call, apply, bind)
    • Programación funcional
    • Scope, hoisting, closures
    • Programación asincrónica
    • Testing
  • HTTP y Sinatra
    • Primeros pasos con Sinatra
    • El protocolo HTTP
    • Rutas
    • Formularios
    • Cookies y sesión
  • Bases de datos
    • Bases de datos relacionales
    • SQL
    • DDL
    • MongoDB
  • Ruby on Rails I
    • Primeros pasos
    • Arquitectura
    • Rutas
    • Layouts y rendering
    • ActiveRecord - Modelos
    • ActiveRecord - Migraciones
    • ActiveRecord - Validaciones
    • ActiveRecord - Asociaciones
    • ActiveRecord - Scopes
    • ActiveRecord - Callbacks
    • Recursos REST
    • Formularios
    • Autenticación con Devise
    • Sass y Bootstrap
    • Envío de correos
    • Carga de imágenes
    • Seeds
    • Heroku
  • Ruby on Rails II
    • Usando JavaScript (y jQuery) en Rails
    • Testing en Ruby
    • Testing en Rails
    • Creando una Web API
    • Web Sockets
  • Express.js
    • Primeros Pasos
    • El protocolo HTTP
    • Rutas
    • Vistas
    • Middlewares y manejo de errores
    • Formularios
    • Cookies y sesión
  • Express.js II
    • Mongoose
    • Web Sockets
    • Autenticación
    • Envío de correos
    • Cargar imágenes
    • Deployment
    • Testing
    • Creando una Web API
  • React
    • Primeros pasos
    • JSX
    • Componentes
    • Más sobre estado
    • Formularios
    • Peticiones HTTP con Axios
    • React Hooks
    • React Context
    • React Bootstrap
    • React Router
    • Carga de Imágenes
    • Testing
    • Estructura de carpetas
    • Componentes de clase
  • Redux
    • Primeros pasos
    • Action creators
    • Usando la librería react-redux
    • Middlewares
    • Operaciones asincrónicas con redux-thunk
    • Combinando funciones reductoras
    • Testing
    • Redux Tool Kit
  • Algoritmos
    • Describiendo un algoritmo
    • Complejidad (Big-O)
    • Estructuras de datos
    • Recursión
    • Ordenamiento
    • Búsqueda
    • Programación dinámica
  • Python
    • Primeros Pasos
    • Tipos y Variables
    • Funciones
    • Control de Flujo
    • Listas
    • Ciclos
    • Diccionarios, Tuplas y Sets
  • NumPy
    • Primeros Pasos
    • Arreglos
    • Arreglos Multidimensionales
    • Estadística con NumPy
    • Distribución Estadística
  • Pandas
    • Primeros Pasos
    • Inspección y Selección de Datos
    • Modificando Dataframes
    • La Función Lambda
    • Aggregates en Pandas
    • Múltiples Tablas
Powered by GitBook
On this page
  • Scope
  • Hoisting
  • Closures
  • "use strict"
  1. JavaScript II

Scope, hoisting, closures

En este capitulo vamos a hablar de algunos conceptos importantes que te van a ayudar a ser un(a) mejor programador(a) en JavaScript.

Scope

El scope define el alcance o la visibilidad de las variables en algún punto de la ejecución del código.

En los navegadores existe un scope global, que es el objeto window; en Node.js es el objeto global.

Con var la única forma de limitar el alcance de una variable era definiéndola dentro de una función:

var a = 5 // variable global

function fn() {
  var b = 5 // visible sólo dentro de la función
}
fn()

console.log(a) // 5
console.log(b) // undefined o error (b no está definido)

let y const limitan el alcance por bloque, es decir, dentro de un condicional, ciclo, función, etc., que es como funcionan la mayoría de lenguajes de programación.

if (true) {
  var a = 5
  let b = 5
  const c = 5
}

console.log(a) // 5
console.log(b) // undefined o error (b no está definido)
console.log(c) // undefined o error (c no está definido)

No olvides la palabra var, let o const al definir una variable o automáticamente se creará una variable global.

Hoisting

Hoisting es el comportamiento por defecto de JavaScript en el que la declaración de variables y funciones se mueve automáticamente al principio del scope (ya sea el principio del archivo, la función o el bloque). Veamos un ejemplo:

hello()

function hello() {
  console.log("Hola")
}

A pesar de que estamos invocando la función hello antes de definirla, esto funciona: la declaración de la función se mueve al principio del archivo antes de ejecutarlo.

La declaración de las variables también se mueve, pero no la inicialización. Considera el siguiente ejemplo:

console.log(x);
let x = 5;

El resultado de este código es undefined porque, aunque la declaración de x se mueve al principio, la inicialización no. El anterior código es equivalente a lo siguiente:

let x;
console.log(x);
x = 5;

De nuevo, lo que se mueve es la declaración de la variable, no la inicialización. Por esta razón, si asignamos una función a una variable, la función no se mueve al principio y no la vamos a poder invocar antes:

hello(); // Error, hello no es una función!!!

const hello = function() {
  console.log("Hola");
}

Lo mismo ocurriría si cambiamos la función por una función flecha.

Closures

En JavaScript las funciones pueden referenciar variables externas. Por otro lado, las funciones se pueden mover de un lado a otro: se pueden asignar a variables, pasar como argumento de otra función y retornar desde otra función.

La pregunta es ¿si movemos una función, qué pasa con las variables externas a las que tenía acceso antes que se moviera?

La respuesta es que, en JavaScript, cuando una función se mueve de un lado a otro, no sólo se mueve la función, también se mantiene la referencia a las variables externas a las que tenía acceso en un principio. A esto se le conoce como un closure (cerradura).

En JavaScript todas las funciones son clousures.

Vemaos un ejemplo.

const hello = function() {
  const name = "Pedro"
  return function() {
    console.log(`Hello ${name}`) // mantiene la referencia a name
  }
}

const newHello = hello()
newHello() // "Hello Pedro"

La función que retorna hello utiliza una variable externa name. En la línea 8 estamos almacenando la función retornada en una variable newHello. Cuando invocamos la función se mantiene la referencia a la variable name.

"use strict"

La directiva "use strict" fue introducida en ES5 para evitar lo que se consideran malas prácticas en JavaScript (p.e. utilizar variables no declaradas). En vez de ignorar la mala práctica se genera un error.

"use strict"

x = 5 // error, x no está definida

La directiva "use strict" es ignorada por versiones anteriores de JavaScript.

Puedes ubicar "use strict" al principio de un archivo (alcance global) o de una función (alcance local).

function estricta() {
  "use strict" // solo aplica a la función

  // ...
}

Algunas de las malas prácticas que "use strict" evita son:

  • Utilizar variables no declaradas.

  • Utilizar eval (eval permite evaluar código a partir de un string).

  • Utilizar palabras reservadas en nombres de variables.

PreviousProgramación funcionalNextProgramación asincrónica

Last updated 2 years ago