Functions and Closures

25
Functions and Closures

description

Functions and Closures. JavaScript Closures Are Everywhere. In JS we often want to say “when this thing happens, do something” event driven programming For example: When the user clicks on an image, show a bigger version of the image - PowerPoint PPT Presentation

Transcript of Functions and Closures

Page 1: Functions  and Closures

Functions and Closures

Page 2: Functions  and Closures

JavaScript Closures Are Everywhere

In JS we often want to say “when this thing happens, do something”

event driven programmingFor example:

When the user clicks on an image, show a bigger version of the imageOn clicking the image, show a new image styled a particular way.

This is all done through closures

Page 3: Functions  and Closures

So what is a Closure? All functions are closures!

Page 4: Functions  and Closures

Lexical Closure

Lexis means word (greek)“the words are bound/enclosed”

Page 5: Functions  and Closures

Function Definition

function foo(bar) {return 1+1;

}

console.log(typeof foo);

Page 6: Functions  and Closures

Function Expression

var foo = function (bar) {return 1+1;

};

console.log(typeof foo);

Page 7: Functions  and Closures

Functions take parameters and return a value (an Object)

Page 8: Functions  and Closures

Notice the lack of difference between a function expression and definition.They’re the same!

Page 9: Functions  and Closures

Functions are just another type of objectlike String, Date, Array, Number, etc.

Page 10: Functions  and Closures

Let’s consider the implications

Page 11: Functions  and Closures

We can instantiate an object inside our function and return it

function foo() {var d = new Date();return d.toLocaleString();

}console.log(foo());// this looks normal

Page 12: Functions  and Closures

We can instantiate an object inside our function and return it

var foo = function() {var s = "and on earth peace to all people of good will";return s;

}console.log(foo());// this looks normal

Page 13: Functions  and Closures

What happens if we replace a common object (like Date or String) with

Function object?

Page 14: Functions  and Closures

We can instantiate an object inside our function and return it

function foo() { //<-- the outer functionvar bar = function () { //<-- the inner function

return "hello world from an inner function";};return bar;

}var aFunction = foo();console.log(aFunciton());// this looks weird at first.

Page 15: Functions  and Closures

There are some interesting repercussions of this.

Page 16: Functions  and Closures

The inner function’s scope includes the scope of the outer functionFeel free to read that a few times.

Page 17: Functions  and Closures

Reminder: What is Scope?When you can reference a variable

Page 18: Functions  and Closures

function scope as you’re used to it.

var n = 1;function foo() {

var n = 2;console.log("n === " n);

}console.log("n === " + n);foo();console.log("n === " + n);

Page 19: Functions  and Closures

function scope in functional languages

var n = 1, inner;function foo() {

var n = 2;console.log("n === ", n);return function () {

console.log("inner n === " + n);};

}console.log("n === " + n);inner = foo();inner();console.log("n === " + n);

Page 20: Functions  and Closures

It also means this will print 1 each time

var n = 1, inner;function foo() {

console.log("n === " + n);return function () {

console.log("inner n === " + n);};

}console.log("n === " + n);inner = foo();inner();console.log("n === " + n);

Page 21: Functions  and Closures

A Partial Summary

Variables from outer functions are available to inner functions.

Page 22: Functions  and Closures

So what’s a global variable?

A variable which forces itself from an inner scope into an

outer.

Page 23: Functions  and Closures

Why do this?An example with setTimeout

Page 24: Functions  and Closures

setTimeoutTakes a function and a time. Will call the function after that many seconds

Page 25: Functions  and Closures

Simple reminder script

var reminder = prompt("What do you need to be reminded of?");setTimeout(function () {

alert(reminder) }, 10);