neelmeg
neelmeg

Reputation: 2509

Does closure always needs be in IIFE?

Any function within function forms a closure. Do closures always needs to be in an immediately invoked function?

The first example is where a closure is formed within an iife and works as expected, gives "8" and "7" as output.

var cat = (function (){
  var lives = 9;
  return function() {
    return --lives;
  }
}());
console.log("iife");
console.log(cat());
console.log(cat());

In the below example the closure does not work as expected, prints the same value every time.

var cat = function (){
  var lives = 9;
  return function() {
    return --lives;
  }
};

console.log("no iife");
console.log(cat()());
console.log(cat()());

Upvotes: 1

Views: 65

Answers (1)

Denys Séguret
Denys Séguret

Reputation: 382150

A closure is just the link between a function and the scope in which it was created, link which exists when the function uses a variable from this scope.

You have this problem because you don't keep the closure: you're recreating it at every console.log when you call cat().

Change

console.log(cat()());
console.log(cat()());

into

let c = cat();
console.log(c());
console.log(c());

Upvotes: 2

Related Questions