SlideShare une entreprise Scribd logo
1  sur  5
Mi a closure?
 A closure olyan objektum (függvény, tömb, stb), ami egy másik függvényen belül lett
  létrehozva és hivatkozik a létrehozó függvényben lévő némely változókra. Ezáltal a
       létrehozó függvény változói (scope-ja) a függvény futása után is elérhetőek
maradnak, amíg csak szükséges. Gyakorlati alkalmazásait a következő diákon mutatom
                                           be.
var szamlalo = (function() {                             A szamlalo egy függvényt kap
      var counter = 0;                                értékként, mikor a külső függvény
      return function() { return counter++; };             lefut. A benne létrehozott
})();                                                   counter változó életben marad,
alert( szamlalo() + '->' + szamlalo() );                  mert hivatkozunk rá a külső
                                                       függvényből való kilépés után is.
 var pelda = function() {
     var variable = 40;                                               Itt viszont nincs closure, mert
     var func = function() { return variable + 1 };                      a pelda függvényből való
     return func() + 1;                                               kilépés után semmilyen belső
 };                                                                     változóra nincs hivatkozás.
 alert(pelda());

2010.03.30. – Budapest.js         A closure szerepe a Javascriptben                      © FARKAS Máté – 1
Adatrejtés, OOP
var newObject = function( step ) {
       var variable = 1; // "private" variable
       var change = function( diff ) { // "private" function
               variable += diff * step;
       };
       return { // "public" functions
               get: function() { return variable; },
               inc: function() { change(1); }
       };
};

var object = newObject( 2 );
object.inc();
alert( object.get() ); // 3




2010.03.30. – Budapest.js      A closure szerepe a Javascriptben   © FARKAS Máté – 2
Callback függvények
$('div').click(function() {
       var $t = $(this);
       $t.fadeOut( function() {
           alert( $t.html() + ' or ' + computedVariable + '?');
       });
       $t.html('Nothing');
       var computedVariable = 42;
});
               Kattintásra létrehozzuk a $t változót, elindítjuk az
               eltűnést, módosítjük a div tartalmát és létrehozunk egy
               újabb változót, ezzel a külső függvény futása véget ér. Az
               eltűnés végeztével kerül a vezérlés a callback
               függvényhez, amely számára minden szükséges változó
               megőrzésre került.


2010.03.30. – Budapest.js        A closure szerepe a Javascriptben   © FARKAS Máté – 3
Név ütközések elkerülése
jQuery.noConflict();
(function( $ ) {
       window.changeSomething = function() {
               $('div').css('background','#ff0');
       }
})( jQuery );            Ha más keretrendszerrel együtt használjuk a
                             jQuery-t, nem szeretnénk, hogy a mindkettő
changeSomething();           által használt $ függvény miatt konfliktus
alert($); // undefined       legyen. A jQuery-re támaszkodó függvé-
                             nyeinket külön scope-ba tesszük, így ezen
                             belül a $ mindig a jQuery-t jelenti, és ezen
                             kívül sem okoz konfliktust.




2010.03.30. – Budapest.js   A closure szerepe a Javascriptben       © FARKAS Máté – 4
Időzítések
var timer = function( $d, start, end ) {
       var counter = start;
       (function() { // one step
               counter++;
               $d.html( counter );
               if (counter < end )
                    setTimeout( arguments.callee, 500 );
               else alert('Finished');
       })();
}                              Az időzítők (setTimeout, setInterval)
var $d = $('div');             a globális névtérben dolgoznak, így
timer($d, 0, 10);              closure-t hoznak létre – az sem baj,
                               ha névtelen függvénnyel dolgozunk.
$d.css('background','#ff0');


2010.03.30. – Budapest.js   A closure szerepe a Javascriptben   © FARKAS Máté – 5

Contenu connexe

En vedette

Notice for convening meeting (2)
Notice for convening meeting (2)Notice for convening meeting (2)
Notice for convening meeting (2)Vishal N. Lokhande
 
Listening comprehension pract (2)
Listening comprehension pract (2)Listening comprehension pract (2)
Listening comprehension pract (2)Vishal N. Lokhande
 
Os Contratos de Licença de Uso de Marca e a Imunidade de PIS e de COFINS sobr...
Os Contratos de Licença de Uso de Marca e a Imunidade de PIS e de COFINS sobr...Os Contratos de Licença de Uso de Marca e a Imunidade de PIS e de COFINS sobr...
Os Contratos de Licença de Uso de Marca e a Imunidade de PIS e de COFINS sobr...Ramon Tomazela
 
Andrew Ellis et al., Physica B, 385-386, (2006), 514 - 516.
Andrew Ellis et al., Physica B, 385-386, (2006), 514 - 516.Andrew Ellis et al., Physica B, 385-386, (2006), 514 - 516.
Andrew Ellis et al., Physica B, 385-386, (2006), 514 - 516.Duncan Gordon
 
D.H. Gordon and S.N. Kukureka, Wear, 267, (2009) 669 - 678.
D.H. Gordon and S.N. Kukureka, Wear, 267, (2009) 669 - 678.D.H. Gordon and S.N. Kukureka, Wear, 267, (2009) 669 - 678.
D.H. Gordon and S.N. Kukureka, Wear, 267, (2009) 669 - 678.Duncan Gordon
 
Personal and professional correspondence pract (2)
Personal and professional correspondence pract (2)Personal and professional correspondence pract (2)
Personal and professional correspondence pract (2)Vishal N. Lokhande
 
The United Kingdom’ s Diverted Profits Tax and Tax Treaties: An Evaluation
The United Kingdom’ s Diverted Profits Tax and Tax Treaties: An EvaluationThe United Kingdom’ s Diverted Profits Tax and Tax Treaties: An Evaluation
The United Kingdom’ s Diverted Profits Tax and Tax Treaties: An EvaluationRamon Tomazela
 
Clase 6 controles de calidad en plantas medicinales
Clase 6 controles de calidad en plantas medicinalesClase 6 controles de calidad en plantas medicinales
Clase 6 controles de calidad en plantas medicinalesIgorVillalta
 
2 programacion curricular - atencion de cabinas de internet y locutorios
2 programacion curricular - atencion de cabinas de internet y locutorios2 programacion curricular - atencion de cabinas de internet y locutorios
2 programacion curricular - atencion de cabinas de internet y locutoriosFernando Horna Palomino
 
La pobreza en el mundo subdesarrollado
La pobreza en el mundo subdesarrolladoLa pobreza en el mundo subdesarrollado
La pobreza en el mundo subdesarrolladoMercedes Díaz
 
Paradigmas Educativos
Paradigmas EducativosParadigmas Educativos
Paradigmas EducativosNancy Navas
 

En vedette (14)

Notice for convening meeting (2)
Notice for convening meeting (2)Notice for convening meeting (2)
Notice for convening meeting (2)
 
Listening comprehension pract (2)
Listening comprehension pract (2)Listening comprehension pract (2)
Listening comprehension pract (2)
 
Os Contratos de Licença de Uso de Marca e a Imunidade de PIS e de COFINS sobr...
Os Contratos de Licença de Uso de Marca e a Imunidade de PIS e de COFINS sobr...Os Contratos de Licença de Uso de Marca e a Imunidade de PIS e de COFINS sobr...
Os Contratos de Licença de Uso de Marca e a Imunidade de PIS e de COFINS sobr...
 
Andrew Ellis et al., Physica B, 385-386, (2006), 514 - 516.
Andrew Ellis et al., Physica B, 385-386, (2006), 514 - 516.Andrew Ellis et al., Physica B, 385-386, (2006), 514 - 516.
Andrew Ellis et al., Physica B, 385-386, (2006), 514 - 516.
 
George boas
George boasGeorge boas
George boas
 
D.H. Gordon and S.N. Kukureka, Wear, 267, (2009) 669 - 678.
D.H. Gordon and S.N. Kukureka, Wear, 267, (2009) 669 - 678.D.H. Gordon and S.N. Kukureka, Wear, 267, (2009) 669 - 678.
D.H. Gordon and S.N. Kukureka, Wear, 267, (2009) 669 - 678.
 
Personal and professional correspondence pract (2)
Personal and professional correspondence pract (2)Personal and professional correspondence pract (2)
Personal and professional correspondence pract (2)
 
The United Kingdom’ s Diverted Profits Tax and Tax Treaties: An Evaluation
The United Kingdom’ s Diverted Profits Tax and Tax Treaties: An EvaluationThe United Kingdom’ s Diverted Profits Tax and Tax Treaties: An Evaluation
The United Kingdom’ s Diverted Profits Tax and Tax Treaties: An Evaluation
 
Clase 6 controles de calidad en plantas medicinales
Clase 6 controles de calidad en plantas medicinalesClase 6 controles de calidad en plantas medicinales
Clase 6 controles de calidad en plantas medicinales
 
La Globalización
La GlobalizaciónLa Globalización
La Globalización
 
2 programacion curricular - atencion de cabinas de internet y locutorios
2 programacion curricular - atencion de cabinas de internet y locutorios2 programacion curricular - atencion de cabinas de internet y locutorios
2 programacion curricular - atencion de cabinas de internet y locutorios
 
La pobreza en el mundo subdesarrollado
La pobreza en el mundo subdesarrolladoLa pobreza en el mundo subdesarrollado
La pobreza en el mundo subdesarrollado
 
Paradigmas Educativos
Paradigmas EducativosParadigmas Educativos
Paradigmas Educativos
 
Malayan union
Malayan unionMalayan union
Malayan union
 

Plus de Máté Farkas

Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScriptMáté Farkas
 
CSS előfeldolgozók
CSS előfeldolgozókCSS előfeldolgozók
CSS előfeldolgozókMáté Farkas
 
Dokumentáljunk, de hogyan?
Dokumentáljunk, de hogyan?Dokumentáljunk, de hogyan?
Dokumentáljunk, de hogyan?Máté Farkas
 
Git és/vagy Subversion
Git és/vagy SubversionGit és/vagy Subversion
Git és/vagy SubversionMáté Farkas
 
Egyszálú JavaScript
Egyszálú JavaScriptEgyszálú JavaScript
Egyszálú JavaScriptMáté Farkas
 
ECMAScript 5 Classes
ECMAScript 5 ClassesECMAScript 5 Classes
ECMAScript 5 ClassesMáté Farkas
 
Automatikus pontosvessző beszúrás a JavaScriptben
Automatikus pontosvessző beszúrás a JavaScriptbenAutomatikus pontosvessző beszúrás a JavaScriptben
Automatikus pontosvessző beszúrás a JavaScriptbenMáté Farkas
 
Többszálú javascript
Többszálú javascriptTöbbszálú javascript
Többszálú javascriptMáté Farkas
 
CSS előfeldolgozók
CSS előfeldolgozókCSS előfeldolgozók
CSS előfeldolgozókMáté Farkas
 

Plus de Máté Farkas (12)

Object Oriented JavaScript
Object Oriented JavaScriptObject Oriented JavaScript
Object Oriented JavaScript
 
Osztályozzunk!
Osztályozzunk!Osztályozzunk!
Osztályozzunk!
 
CSS előfeldolgozók
CSS előfeldolgozókCSS előfeldolgozók
CSS előfeldolgozók
 
Dokumentáljunk, de hogyan?
Dokumentáljunk, de hogyan?Dokumentáljunk, de hogyan?
Dokumentáljunk, de hogyan?
 
Git és/vagy Subversion
Git és/vagy SubversionGit és/vagy Subversion
Git és/vagy Subversion
 
Egyszálú JavaScript
Egyszálú JavaScriptEgyszálú JavaScript
Egyszálú JavaScript
 
ECMAScript 5 Classes
ECMAScript 5 ClassesECMAScript 5 Classes
ECMAScript 5 Classes
 
Use strict
Use strictUse strict
Use strict
 
IEEE-754
IEEE-754IEEE-754
IEEE-754
 
Automatikus pontosvessző beszúrás a JavaScriptben
Automatikus pontosvessző beszúrás a JavaScriptbenAutomatikus pontosvessző beszúrás a JavaScriptben
Automatikus pontosvessző beszúrás a JavaScriptben
 
Többszálú javascript
Többszálú javascriptTöbbszálú javascript
Többszálú javascript
 
CSS előfeldolgozók
CSS előfeldolgozókCSS előfeldolgozók
CSS előfeldolgozók
 

A closure szerepe a javascriptben

  • 1. Mi a closure? A closure olyan objektum (függvény, tömb, stb), ami egy másik függvényen belül lett létrehozva és hivatkozik a létrehozó függvényben lévő némely változókra. Ezáltal a létrehozó függvény változói (scope-ja) a függvény futása után is elérhetőek maradnak, amíg csak szükséges. Gyakorlati alkalmazásait a következő diákon mutatom be. var szamlalo = (function() { A szamlalo egy függvényt kap var counter = 0; értékként, mikor a külső függvény return function() { return counter++; }; lefut. A benne létrehozott })(); counter változó életben marad, alert( szamlalo() + '->' + szamlalo() ); mert hivatkozunk rá a külső függvényből való kilépés után is. var pelda = function() { var variable = 40; Itt viszont nincs closure, mert var func = function() { return variable + 1 }; a pelda függvényből való return func() + 1; kilépés után semmilyen belső }; változóra nincs hivatkozás. alert(pelda()); 2010.03.30. – Budapest.js A closure szerepe a Javascriptben © FARKAS Máté – 1
  • 2. Adatrejtés, OOP var newObject = function( step ) { var variable = 1; // "private" variable var change = function( diff ) { // "private" function variable += diff * step; }; return { // "public" functions get: function() { return variable; }, inc: function() { change(1); } }; }; var object = newObject( 2 ); object.inc(); alert( object.get() ); // 3 2010.03.30. – Budapest.js A closure szerepe a Javascriptben © FARKAS Máté – 2
  • 3. Callback függvények $('div').click(function() { var $t = $(this); $t.fadeOut( function() { alert( $t.html() + ' or ' + computedVariable + '?'); }); $t.html('Nothing'); var computedVariable = 42; }); Kattintásra létrehozzuk a $t változót, elindítjuk az eltűnést, módosítjük a div tartalmát és létrehozunk egy újabb változót, ezzel a külső függvény futása véget ér. Az eltűnés végeztével kerül a vezérlés a callback függvényhez, amely számára minden szükséges változó megőrzésre került. 2010.03.30. – Budapest.js A closure szerepe a Javascriptben © FARKAS Máté – 3
  • 4. Név ütközések elkerülése jQuery.noConflict(); (function( $ ) { window.changeSomething = function() { $('div').css('background','#ff0'); } })( jQuery ); Ha más keretrendszerrel együtt használjuk a jQuery-t, nem szeretnénk, hogy a mindkettő changeSomething(); által használt $ függvény miatt konfliktus alert($); // undefined legyen. A jQuery-re támaszkodó függvé- nyeinket külön scope-ba tesszük, így ezen belül a $ mindig a jQuery-t jelenti, és ezen kívül sem okoz konfliktust. 2010.03.30. – Budapest.js A closure szerepe a Javascriptben © FARKAS Máté – 4
  • 5. Időzítések var timer = function( $d, start, end ) { var counter = start; (function() { // one step counter++; $d.html( counter ); if (counter < end ) setTimeout( arguments.callee, 500 ); else alert('Finished'); })(); } Az időzítők (setTimeout, setInterval) var $d = $('div'); a globális névtérben dolgoznak, így timer($d, 0, 10); closure-t hoznak létre – az sem baj, ha névtelen függvénnyel dolgozunk. $d.css('background','#ff0'); 2010.03.30. – Budapest.js A closure szerepe a Javascriptben © FARKAS Máté – 5