Top Banner
 secrets of javascript closures stuart langridge fronteers, september 2008 secrets of javascript closures fronteers, september 2008 stuart langridge
54

secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

Apr 19, 2018

Download

Documents

phungque
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

secrets of javascript closures

fronteers, september 2008

stuart langridge

Page 2: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

what's a closure?

Page 3: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

one of the greatmysteries

Page 4: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

confusion

Page 5: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

zen

Page 6: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

In computer science, a closure is a function that is evaluated in an environment containing one or more bound variables. When 

called, the function can access these variables.

Page 7: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

In computer science, a closure is a function that is evaluated in an environment containing one or more bound variables. When 

called, the function can access these variables.

Page 8: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

dictionary

Page 9: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

closure:where a functionremembers what

happens around it

Page 10: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

Page 11: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

Page 12: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

one functiondefined inside another

Page 13: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function outer() { ... function inner() { ... } ...}

Page 14: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function outer() { var x = 5; function inner() { alert(x); } inner();}

Page 15: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function outer() { var x = 5; function inner() { alert(x); } setTimeout(inner, 5000);}

Page 16: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

power

Page 17: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

things called later on

Page 18: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

setTimeoutsetInterval

Ajax callbacksevent handlers

Page 19: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function main() { var mv = document.getElementById(“mover”); var counter = 0; var tick = setInterval(function() { mv.style.top = counter + “px”; counter += 1; if (counter > 100) { clearInterval(tick); } }, 100);}

main();

Page 20: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function main(mv) { var counter = 0; var tick = setInterval(function() { mv.style.top = counter + “px”; counter += 1; if (counter > 100) { clearInterval(tick); } }, 100);}

main(document.getElementById(“mv”));

Page 21: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function main(mv, start, finish, inc) { var tick = setInterval(function() { mv.style.top = start + “px”; start += inc; if (start > finish) { clearInterval(tick); } }, 100);}

main(document.getElementById(“mv”),0,100,1);

Page 22: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

this

Page 23: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

that

Page 24: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

this and that

Page 25: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function main(link) { link.onclick = function(e) { var newa = document.createElement("a"); var tn = document.createTextNode("second"); newa.appendChild(tn); newa.href = "#"; this.firstChild.nodeValue = "clicked"; var that = this; document.body.appendChild(newa); newa.onclick = function(e) { that.firstChild.nodeValue = "reset"; this.parentNode.removeChild(this); } }}

Page 26: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

object oriented

Page 27: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

the boss

Page 28: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

publicprivate

privileged

Page 29: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } var secret = 3; var that = this; this.service = function () { if (dec()) { return param; } else { return null; } };}

Page 30: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } var secret = 3; var that = this; this.service = function () { if (dec()) { return param; } else { return null; } };}

private

Page 31: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } var secret = 3; var that = this; this.service = function () { if (dec()) { return param; } else { return null; } };}

private

privileged

Page 32: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var that = this; this.service = function () { if (dec()) { return that.member; } else { return null; } };}

private

privileged

Page 33: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

var c = new Container("value");console.log(c.service()); → “value” console.log(c.service()); → “value”console.log(c.service()); → “value”console.log(c.service()); → null

Page 34: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

revealing module pattern

(Christian Heilmann)

Page 35: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

helpers = function() { function reg(c){ return new RegExp('(\\s|^)'+c+'(\\s|$)'); }; function hasClass(el,c){ return el.className.match(reg(c));}; function addClass(el,c){ if (!hasClass(el,c)) el.className += " " + c; }; function removeClass(el,c) { if (hasClass(el,c)) { el.className=el.className.replace(reg(c),' '); } }; return { addClass: addClass, removeClass: removeClass, hasClass: hasClass }}();

Page 36: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

helpers = function() { function reg(c){ return new RegExp('(\\s|^)'+c+'(\\s|$)'); }; function hasClass(el,c){ return el.className.match(reg(c));}; function addClass(el,c){ if (!hasClass(el,c)) el.className += " " + c; }; function removeClass(el,c) { if (hasClass(el,c)) { el.className=el.className.replace(reg(c),' '); } }; return { addClass: addClass, removeClass: removeClass, hasClass: hasClass }}();

Page 37: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

Page 38: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

Don't use closures unless you really need closure semantics.

 In most cases, non­nested functions are the right way to go.

Eric Lippert, Microsoft  

Page 39: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

May not entirely be the truth

Page 40: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function AttachEvent(elem) { elem.attachEvent("mouseover", function() { alert(this); });}AttachEvent(someElement);

Page 41: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function AttachEvent(elem) { elem.attachEvent("mouseover", function() { alert(this); });}AttachEvent(someElement);

elem has a referenceto the handler

Page 42: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function AttachEvent(elem) { elem.attachEvent("mouseover", function() { alert(this); });}AttachEvent(someElement);

handler has a referenceto the element(in the closure)

Page 43: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

Page 44: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

Beware ofaccidental closures

in IE 

Page 45: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

loops

Page 46: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function main(links) { for (var i=0; i<links.length; i++) { links[i].onclick = function() { alert(i+1); } } };

main(document.getElementsByTagName("a"));

Page 47: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function main(links) { for (var i=0; i<links.length; i++) { links[i].onclick = function() { alert(i+1); } } };

main(document.getElementsByTagName("a"));

FAIL

Page 48: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

alerts 6, 6, 6, 6, 6

Page 49: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function main(links) { for (var i=0; i<links.length; i++) { links[i].onclick = function( ) {

alert(i+1);

} } };

main(document.getElementsByTagName("a"));

Page 50: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function main(links) { for (var i=0; i<links.length; i++) { links[i].onclick = (function(i) { return function() { alert(i+1); } })(i); } };

main(document.getElementsByTagName("a"));

Page 51: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

function main(links) { for (var i=0; i<links.length; i++) { links[i].onclick = (function(j) { return function() { alert(j+1); } })(i); } };

main(document.getElementsByTagName("a"));

Page 52: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

power

Page 53: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

enlightenment

Page 54: secrets of javascript closures - Kryogenix Consulting · secrets of javascript closures stuart langridge fronteers, september 2008. Author: Stuart Langridge Created Date: 9/12/2008

    secrets of javascript closuresstuart langridge

fronteers, september 2008

Thanks tocarbonnyc, parhessiastes, judgmentalist, perreira, philip9876,doug crockford, john resig, chris heilmann

fin.http://tinyurl.com/jsclosures