Solucio clausures

De wikiserver
Dreceres ràpides: navegació, cerca

Exemple

var missatge = "hola";
var despres;
 
function accedirValor(){
    var missatge_intern = "adeu";
    function accedirValorInternExtern(){
        alert("extern: " +  missatge);        //les variables es mantenen vives 
        alert("intern: " +missatge_intern);   
    }
    despres = accedirValorInternExtern;        //es igual a accedirValorInterneExtern();
}
 
accedirValor();
despres();       // mostra 'extern: hola' y després 'intern: adeu'

Exemple

var missatge = "hola";
var despres;
 
function accedirValor(){
    var missatge_intern = "adeu";
    function accedirValorInternExtern(salutacio){
        alert("extern: " +  missatge);
        alert("intern: " + missatge_intern);
        alert("salutacio " + salutacio);
        alert("fin " + fin);
    }
    despres = accedirValorInternExtern;
}
 
alert("mintern" + missatge_intern);    //dona error hi ha que comentar la linia
alert(fin);                            // undefined!!
var fin = "tard";
accedirValor();
despres("fins despres");    
          
/*mostra 'extern:hola', 
'intern:adeu', 
'salutació: fins després'
'fins tard'*/

Exemple

function Persona(){
	var anys = 0;
	this.getAnys = function(){
		return anys;
	};
	this.envellir = function(){
		anys++;
	};
}

var joan = new Persona();
joan.envellir();

alert("no podem accedir: " + joan.anys);  /*mostra 'no podem accedir: undefined'*/
alert("getanys: " + joan.getAnys());      /*mostra 'getanys: 1'*/


Exercici 1. Digues que mostra.

function concatenar(s1) {
      return function(s2) {
        return s1 + ' ' + s2;
      };
}

var diHola = concatenar("Hola");

alert( diHola("visitante") );    /*mostra 'Hola visitante'*/


Exercici 2. Digues que mostra.

function dirHola2(nom) {
 var texto = 'Hola ' + nom; // local variable
 var dirAlerta= function() { alert(texto); }
 return dirAlerta;
}

var dir2=dirHola2('Joan');

dir2();               /*mostra 'Hola Joan'*/


Exercici 3. Digues que mostra.

function dir667() {
 // Variable local que acaba en la clausura
 var num = 666;
 var dirAlerta= function() { alert(num); }
 num++;
 return dirAlerta;
}


var dirNombre=dir667();

dirNombre();      //mostra '667'


Exercici 4. Digues que mostra.

var unicId = (function() { 
  var comptador = 0; 
  return function() { 
    return "únic-id-" + comptador++; 
  }; 
})(); // Funció que s'auto-invoca i executa automàticament  
 

unicId();     // 0

unicId();     // 1

unicId();     //  2

Exercici 5. Digues que mostra.

var crearContador = function () {
    var cuenta, f;
    cuenta = 0;
    f = function () {
        cuenta = cuenta + 1;
        return cuenta;
    };
    return f;
};
var contador = crearContador();
/* contador es una funcion que no recibe argumentos
   y retorna una cuenta */

var a = contador(); // obtiene 1
var b = contador(); // obtiene 2
var c = contador(); // obtiene 3

var contador2 = crearContador(); // crear otro mas
var d = contador2(); // obtiene 1
var e = contador2(); // obtiene 2
var f = contador(); // obtiene 4 del primero