JAVASCRIPT ISIS 3710 Javascript: Funciones En JS, no hay chequeo de tipo ni de número de parámetros var x = function (a, b) {return a * b}; Javascript: Funciones En JS, no hay chequeo de tipo ni de número de parámetros var x = function (a, b) {return a * b}; var z = x(4); var z = x(); ? Javascript: Funciones En JS, no hay chequeo de tipo ni de número de parámetros var x = function (a, b) {return a * b}; var z = x(4); NaN var z = x(); NaN Javascript: Funciones En JS, las funciones pueden ser argumentos de otras funciones var someFunction = function() { … }; someOtherFunction(someFunction); someOtherFunction(function(){ … }); Ejemplo: la función every var ages = [32, 33, 16, 40]; function checkAdult(age) { return age >= 18; } function myFunction() { document.getElementById("demo").innerHTML = ages.every(checkAdult); } myFunction(); Ejemplo: la función every var ages = [32, 33, 16, 40]; function checkAdult(age) { return age >= 18; } function myFunction() { document.getElementById("demo").innerHTML = ages.every(checkAdult); } myFunction(); La función every verifica que todos los elementos en un arreglo pasan una prueba que es proporcionada como parámetro Ejemplo: la función forEach <script> var numbers = [4, 9, 16, 25]; function myFunction(item, index) { console.log("index[" + index + "]: " + item); } numbers.forEach(myFunction) </script> Ejemplo: la función forEach <script> var numbers = [4, 9, 16, 25]; function myFunction(item, index) { console.log("index[" + index + "]: " + item); } numbers.forEach(myFunction) </script> index[0]: index[1]: index[2]: index[3]: 4 9 16 25 Ejemplo: la función forEach <script> var numbers = [4, 9, 16, 25]; function myFunction(index, item) { console.log("index[" + index + "]: " + item); } numbers.forEach(myFunction) </script> Ejemplo: la función forEach <script> var numbers = [4, 9, 16, 25]; function myFunction(index, item) { console.log("index[" + index + "]: " + item); } numbers.forEach(myFunction) </script> index[4]: 0 index[9]: 1 index[16]: 2 index[25]: 3 Ejemplo: la función forEach <!DOCTYPE html> <html> <body> <script> var numbers = [4, 9, 16, 25]; function myFunction(item) { console.log("index[" + index + "]: " + item); } numbers.forEach(myFunction) </script> </body> </html> Ejemplo: la función forEach <!DOCTYPE html> <html> <body> <script> var numbers = [4, 9, 16, 25]; function myFunction(item) { console.log("index[" + index + "]: " + item); } numbers.forEach(myFunction) </script> </body> </html> ? Ejemplo: la función forEach <!DOCTYPE html> <html> <body> <script> var numbers = [4, 9, 16, 25]; function myFunction(item) { console.log("index[" + index + "]: " + item); } numbers.forEach(myFunction) </script> </body> </html> >> Uncaught ReferenceError: index is not defined Funciones: Invocaciones anidadas <!DOCTYPE html> <html> <body> <script> function testArg(){ var msg = "Hola"; function innerCall(){ console.log(msg); } innerCall(); } testArg(); </script> </body> </html> Funciones: Invocaciones anidadas <!DOCTYPE html> <html> <body> <script> function testArg(){ var msg = "Hola"; function innerCall(){ console.log(msg); } innerCall(); } testArg(); </script> </body> </html> >>Hola Funciones: Invocaciones anidadas <!DOCTYPE html> <html> <body> <script> var chapter = { num:7, title: "Function in object", getNum: function(){return num} }; console.log(chapter.getNum()); </script> </body> </html> Funciones: Invocaciones anidadas <!DOCTYPE html> <html> <body> <script> var chapter = { num:7, title: "Function in object", getNum: function(){return num} }; console.log(chapter.getNum()); </script> </body> </html> >>Uncaught ReferenceError: num is not defined Funciones: Invocaciones anidadas <!DOCTYPE html> <html> <body> <script> var chapter = { num:7, title: "Function in object", getNum: function(){return this.num} }; console.log(chapter.getNum()); </script> </body> </html> Funciones: Invocaciones anidadas <!DOCTYPE html> <html> <body> <script> var chapter = { num:7, title: "Function in object", getNum: function(){return this.num} }; console.log(chapter.getNum()); </script> </body> </html> >>7 Excepciones try{ … }catch(error){ … }finally{ … } try{ … }catch(error){ console.log(error.name); console.log(error.message); } Excepciones throw 2; >> Uncaught 2 throw "Something is wrong"; >> Uncaught Something is wrong throw Error("This is an error"); >> Uncaught Error: This is an error throw {name:'Error', message:'Ooops'}; >> Uncaught [object Object] Excepciones <!DOCTYPE html> <html> <body> <script> function test(){ throw 2; throw "Something is wrong"; throw Error("This is an error"); throw {name:'Error', message:'Ooops'}; } test(); </script> </body> </html> ? Prototipos Prototipo: Plantilla de objetos definidas como una función constructora con atributos internos function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } Prototipos Prototipo: Plantilla de objetos definidas como una función constructora con atributos internos function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } var myFather = new Person("John", "Doe", 50, "blue"); var myMother = new Person("Sally", "Rally", 48, "green"); Prototipos Se pueden agregar métodos a los prototipos en tiempo de ejecución function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } var mario = new Person('Mario', 'Linares', '??', 'hazel'); Person.prototype.name = function() {return this.firstName+" "+ this.lastName}; console.log(mario.name()); Closures - Función con memoria y variables privadas - Definición encadenada de funciones, en la que la segunda (anónima) tiene acceso al contexto de la primera - Las funciones “closure” tienen acceso a tres scopes: local, función padre, y global - Las funciones “closure” acceden a las variables de la función padre incluso después de ejecutada Closures <script> var add = function () { var counter = 0; return counter += 1; }; console.log(add()); console.log(add()); console.log(add()); </script> Closures <script> var add = function () { var counter = 0; return counter += 1; }; console.log(add()); console.log(add()); console.log(add()); </script> <script> var counter = 0; var add = function () { return counter += 1; }; console.log(add()); console.log(add()); console.log(add()); </script> Closures <script> var add = function () { var counter = 0; return function () {return counter += 1;} }; console.log(add()); console.log(add()); console.log(add()); </script> Closures <script> var add = function () { var counter = 0; return function () {return counter += 1;} }; console.log(add()); console.log(add()); console.log(add()); </script> >> function () {return counter += 1;} >> function () {return counter += 1;} >> function () {return counter += 1;} Closures <script> var add = (function () { var counter = 0; return function () {return counter += 1;} };)() console.log(add()); console.log(add()); console.log(add()); </script> Closures <script> var add = (function () { var counter = 0; return function () {return counter += 1;} };)() console.log(add()); console.log(add()); console.log(add()); </script> >> 1 >> 2 >> 3 Closures //function declaration (statement) function bar() { return 3; } //anonymous function expression var a = function() { return 3; } //named function expression var a = function bar() { return 3; } //immediately invoked function expression (IIFE) (function sayHello() { alert("hello!"); })(); Obligatorio leer: https://en.wikipedia.org/wiki/Immediately-invoked_function_expression Mas Javascript… function one(){ function two() { return 2; } return two(); function two() { return 3; } } alert(one()); function one(){ var two = function() { return 2; }; return two(); var two = function() { return 3; }; } alert(one()); Obligatorio leer: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html Mas Javascript… function one(){ function two() { return 2; } return two(); function two() { return 3; } } alert(one()); function one(){ var two = function() { return 2; }; return two(); var two = function() { return 3; }; } alert(one()); >>3 Obligatorio leer: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html Mas Javascript… function one(){ function two() { return 2; } return two(); function two() { return 3; } } alert(one()); >>3 function one(){ var two = function() { return 2; }; return two(); var two = function() { return 3; }; } alert(one()); >>2 Obligatorio leer: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html Mas Javascript… alert(one()); function one(){ var two = function() { return 2; }; return two(); var two = function() { return 3; }; } function one(){ return two(); var two = function() { return 3; }; var two = function() { return 3; }; } alert(one()); Obligatorio leer: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html Mas Javascript… alert(one()); function one(){ var two = function() { return 2; }; return two(); var two = function() { return 3; }; } function one(){ return two(); var two = function() { return 3; }; var two = function() { return 3; }; } alert(one()); >>2 Obligatorio leer: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html Mas Javascript… alert(one()); function one(){ var two = function() { return 2; }; return two(); var two = function() { return 3; }; } >>2 function one(){ return two(); var two = function() { return 3; }; var two = function() { return 3; }; } alert(one()); >>Uncaught TypeError: two is not a function Obligatorio leer: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html Promesas (Promises) Declaración de ejecuciones futuras condicionales, asociadas con llamadas asíncronas o síncronas éxito/fallo: p.then(e, f) Promesas (Promises) Declaración de ejecuciones futuras condicionales, asociadas con llamadas asíncronas o síncronas éxito/fallo: p.then(e, f) Función a ejecutar como parte de la promesa Promesas (Promises) Declaración de ejecuciones futuras condicionales, asociadas con llamadas asíncronas o síncronas éxito/fallo: p.then(e, f) Comportamiento a ejecutar en caso de éxito Promesas (Promises) Declaración de ejecuciones futuras condicionales, asociadas con llamadas asíncronas o síncronas éxito/fallo: p.then(e, f) Comportamiento a ejecutar en caso de fallo Promesas (Promises) Expresión usando el constructor Promise var promise = new Promise(function(resolve, reject) { ….. if (success) { resolve(…); } else { reject(…); } }); Promesas (Promises) Expresión usando el constructor Promise var promise = new Promise(function(resolve, reject) { ….. if (success) { resolve(…); } else { reject(…); } }); Promesas (Promises) Definición de los métodos a ejecutar con la promesa promise.then(function(result) { console.log(result); // Caso de éxito }, function(err) { console.log(err); // Caso de error } ); Promesas (Promises) Disponibles en los siguientes browsers 32 19 29 8 Ejemplo function get(url) { return new Promise(function(resolve, reject) { var req = new XMLHttpRequest(); req.open('GET', url); req.onload = function() { if (req.status == 200) { resolve(req.response); } else { reject(Error(req.statusText)); } }; req.send(); }); } Tomado de https://developers.google.com/web/fundamentals/getting-started/primers/promises Ejemplo get('story.json').then(function(response) { console.log("Success!", response); }, function(error) { console.error("Failed!", error); }); Tomado de https://developers.google.com/web/fundamentals/getting-started/primers/promises Encadenamiento p.then(e).then(e)… var promise = new Promise(function(resolve, reject) { resolve(1); }); promise.then(function(val) { console.log(val); // 1 return val + 2; }).then(function(val) { console.log(val); // 3 }) Tomado de https://developers.google.com/web/fundamentals/getting-started/primers/promises Promesas múltiples Promise.all(arrayOfPromises).then( function(arrayOfResults) { //... } ); Tomado de https://developers.google.com/web/fundamentals/getting-started/primers/promises