JSFiddle - React, Tailwind, and code Playground

JavaScript

(function test0 () {
    // x is closed over, it doesn't change in the outer scope
    var incr = function(x) { return x + 1;}; 
    var makeclosure = function () {
        var x = 0; 
        return function () { 
            x = incr(x); 
            console.log(x);
        }; 
    };
    
    var x = "x";
    
    console.log(x);
    
    var c = makeclosure();
    
    c();
    c();
    incr = function(x) { return x - 1;}; 
    c();
    c();
    
    console.log(x);
        
}());

console.log(' ');

(function test1 () {
     // putting incr inside the closure, now it won't get overwritten
     var c = (function() {
        var incr = function (x) { return x + 1;}
        var x = 0;
         
        return function () { 
            x = incr(x); 
            console.log(x);
        }; 
    })();
    
    c();
    c();
    var incr = function(x) { return x - 1;}; 
    c();
    c();
    
}());

console.log(' ');

(function test2 () {
    // going one more scope outward, with incr now being closed over
    var outer = (function anotherScope() {
        var incr = function(x) { return x + 1;}; 
        var makeclosure = function () {
            var x = 0; 
            return function () { 
                x = incr(x); 
                console.log(x);
            }; 
        };
        
        var c = makeclosure();
        
        c();
        c();
        incr = function(x) { return x - 1;}; 
        c();
        c();
        
        return c;
    }());
    
    outer();
    outer();
    var incr = function(x) { return "not called" }
    outer();
    outer();    
    
}());

console.log(' ');

(function test3 () {
    // omitting the var keyword, so function declarations are hoisted
    function incr(x) { return x + 1;}; 
    var makeclosure = function () {
        var x = 0; 
        return function () { 
            x = incr(x); 
            console.log(x);
        }; 
    };
    
    var c = makeclosure();
    c();
    c();
    function incr(x) { return...