Novedades ES6

Argumentos en funciones y variables locales y variables globales

Cuando llamamos a una función JavaScript crea automáticamente un objeto llamado "arguments" que almacena los valores que le pasamos a dicha función. Las variables locales se definen dentro de una función y las variables globales son las que definimos fuera de cualquier función

Objeto arguments en funciones

El objeto arguments almacena en una propiedad llamada length la cantidad de parámetros que llegaron. Veamos un ejemplo muy sencillo. Confeccionar una función que retorne la suma de dos enteros:

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<script>
function sumar(x,y)
{
var s=x+y;
return s;
}

document.write(sumar(5,3)); </script>

</body>
</html>

Luego podemos resolver esta misma función accediendo al objeto arguments que se crea cada vez que llamamos a una función:

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<script>
function sumar(x,y)
{
var s=arguments[0]+arguments[1];
return s;
}

document.write(sumar(5,3));
</script>

</body>
</html>

Como podemos observar dentro de la función sumar accedemos al primer parámetro mediante el objeto arguments (con el subíndice 0 accedemos al primer parámetro llamado x) Tenemos dos formas de acceder al primer parámetro de la función : con el nombre x o con arguments[0].

Si debemos sumar dos valores que llegan como parámetro el algoritmo más claro es el primero en lugar que tener que acceder al objeto "arguments", pero veremos que en muchas situaciones el objeto "arguments" nos favorece en la implementación de funciones mucho más complejas y reutilizables.

Problema

Confeccionar una función que reciba un conjunto variable de enteros y nos retorne su suma:

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<script>
function sumar()
{
var s=0;
var f;
for(f=0; f<arguments.length; f++)
{
s=s+arguments[f];
}
return s;
}

document.write(sumar(2,4));
document.write('<br>');
document.write(sumar(1,2,3,4,5));
document.write('<br>');
document.write(sumar(100,200,300));
</script>

</body>
</html>

Como no sabemos con cuantos parámetros llamaremos a la función sumar no indicamos ningún parámetro. Luego la única forma de acceder a los parámetros es mediante el objeto "arguments" y por medio del subíndice accedemos uno a uno. También el objeto "arguments" tiene una propiedad length que almacena la cantidad de parámetros recibidos por la función.

Esta sintaxis nos permite codificar funciones muy poderosas que se adaptan a muchas situaciones, como vemos luego podemos llamar a la función sumar pasando 2 parámetros:

document.write(sumar(2,4));

5 parámetros:

document.write(sumar(1,2,3,4,5));

3 parámetros:

document.write(sumar(100,200,300));

etc.

Problema

Confeccionar una función que reciba un conjunto de string y genere dentro de la página una lista ordenada (<ol>). La función debe recibir en el primer parámetro el id de un div.

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<div id="lista1"></div>

<script>
window.onload=iniciar;

function iniciar()
{
generarLista('lista1','uno','dos','tres','cuatro','cinco','seis');
}

function generarLista()
{
var s='<ol>';
var f;
for(f=1;f<arguments.length;f++)
{
s=s+'<li>'+arguments[f]+'</li>';
}
s=s+'</ol>';
var elemento1=document.getElementById(arguments[0]);
elemento1.innerHTML=s;
}
</script>

</body>
</html>

Veamos por partes el funcionamiento de este programa. En el body de la página hemos definido un div con id llamado "lista1" sin contenido:

<div id="lista1"></div>

En el bloque del script inicializamos la propiedad onload del objeto window indicando la función a ejecutar luego que la página esta completamente cargada:

window.onload=iniciar;

Es decir que la función iniciar se ejecuta una vez que la página está completamente construida (es decir ya está en memoria el div definido en el body)

La función iniciar es la que llama a la función generarLista pasando como parámetros primero el id del div a cargar y a partir del segundo parámetro en adelante los distintos string a mostrar en cada elemento del <ol>:

function iniciar() {
generarLista('lista1','uno','dos','tres','cuatro','cinco','seis');
}

Finalmente la función generarLista que como podemos observar no tiene parámetros explícitos, sino que los accedemos luego mediante el objeto arguments. Disponemos un for que lo inicializamos en 1 ya que el argumento cero tiene el nombre del id del div:

function generarLista() {
var s='<ol>';
var f;
for(f=1;f<arguments.length;f++)
{
s=s+'<li>'+arguments[f]+'</li>';
}
s=s+'</ol>';
var elemento1=document.getElementById(arguments[0]);
elemento1.innerHTML=s;
}

Mediante el método getElementById obtenemos la referencia del div que llega como parámetro en el arguments[0]. y luego mediante la propiedad innerHTML indicamos todo el código HTML que debe cargarse en el div. En este caso almacenamos en la variable s todas las marcas necesarios para generar la lista ordenada.

Variables locales y variables globales en funciones

Las variables locales se definen dentro de una función y solo se tiene acceso dentro de la misma función. Una variable local se la define antecediendo la palabra clave var al nombre de la variable.

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<script>
function imprimir()
{
var x=10;
document.write(x)
;
}

imprimir();
</script>

</body>
</html>

Luego decimos que x es una variable local que solo se la puede acceder dentro de la función imprimir. Si intentamos acceder a la variable x fuera de la función se produce un error en tiempo de ejecución:

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<script>
function imprimir()
{
var x=10;
document.write(x);
}

imprimir();
document.write(x); //error en tiempo de ejecución

</script>

</body>
</html>

Si bien en la pantalla no se ve el error en un depurador de código se vera el error como lo muestra la imagen de abajo.

Erro en javascript

Las variables globales son las que definimos fuera de cualquier función. Una variable global tenemos acceso fuera y dentro de las funciones:

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<script>
function imprimir()
{
document.write(global1+'<br>'); // muestra un 100
global1++;
}

var global1=100;
imprimir();
document.write(global1); // muestra un 101
</script>

</body>
</html>

Como podemos observar el programa anterior hemos definido la variable global1 e inicializado con el valor 100. Luego dentro de la función podemos acceder para imprimirla y modificarla. Podemos ver luego si la accedemos fuera de la función su valor fue modificado.

Todas las variable globales se convierten en atributos del objeto window, luego podemos acceder a la variable por su nombre o antecediendo el nombre del objeto:

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<script>
var global1=100;
document.write(global1+'<br>'); //100
document.write(window.global1+'<br>'); //100
</script>

</body>
</html>

Cuidado

Cuando definimos variables locales dentro de una función tenemos que no olvidarnos de anteceder al nombre de la variable la palabra var, en caso de olvidarnos se creará automáticamente una variable global con dicho nombre:

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<script>
function imprimir()
{
x=100;
document.write(x+'<br>');
}

imprimir();
document.write(x+'<br>');
</script>

</body>
</html>

En el ejemplo superior en la función imprimir se está creando una variable global llamada x. Como podemos ver luego fuera de la función cuando imprimimos x vemos que no produce error y muestra el valor 100. Con solo agregar la palabra clave var vemos que nos muestra un mensaje de error al tratar de acceder a una variable inexistente:

function imprimir()
{
var x=100;
document.write(x+'<br>');
}
imprimir();
document.write(x+'<br>');

El JavaScript moderno introduce una directiva para salvar este y otros problemas muy comunes. Si activamos modo estricto todas las variables en JavaScript deben declarase sino se produce un error. Veamos como introducimos esta directiva de modo estricto:

<!DOCTYPE html>
<html>
<head>
<title>Ejemplo de JavaScript</title>
<meta charset="UTF-8">
</head>
<body>

<script>
'use strict';

function imprimir()
{
x=100; //error
document.write(x+'<br>');
}

imprimir();
document.write(x+'<br>');
</script>

</body>
</html>

La directiva de modo estricto se emplea las palabras claves use strict entre comillas simples o dobles y un punto y coma. Solo los navegadores modernos implementan los análisis de modo estricto.
La razón de disponer la directiva entre comillas y con un punto y coma es para que navegadores antiguos pasen por alto el string (ya que el string no se asigna a nadie el navegador antiguo no lo tiene en cuenta)
Activando el modo estricto luego cuando tratamos de asignar el valor 100 a la variable x se produce un error ya que no se nos permite crear una variable global (esto nos evita problemas de crear variables globales en funciones por error)

Si bien en la pantalla no se ve el error en un depurador de código se vera el error como lo muestra la imagen de abajo.

Erro en javascript

En la imagen del depurador se ven dos errores esta el nombre del archivo y los numeros (14 y 18) son las líneas de los errores en el código.

x is not defined
at imprimir (eje53_9.html:14)
at eje53_9.html:18