In simple language, Closures means that the inner function has access to the variables of the outer functions even after the function has returned.
So what this means actually? Let’s take an example. Suppose you have a function which returns a function.
I have just declared a function which takes a parameter has its own variable and returns a function which takes a parameter and its own variable.
function outerFunction(outerParameter) {
    var outerVariable = 2;
    return function(innerParameter) {
        var innerVariable = 4;
        console.log("Hey look! I can access " + outerParameter + ", " + outerVariable + " as well as " + innerParameter + " and " + innerVariable + ".");

Now with our knowledge of Execution Stack and Scope Chain, after the following lines of code,
var innerFunction = outerFunction(1);

is executed. We should get an error that outerParameter and outerVariable are not defined as when innerFunction is called the outerFunction context has been removed from the execution stack and the variables associated with are (should be?) removed.
But then the magic of Closures begin. So actually what happens is the scope of the outerFunction remains in the scope chain even after its context is removed from the execution stack and since the inner function is entered lexically in the outer function it gets access to the scope of the outer function. So, due to closure, the scope chain always stays intact. Now read the definition again, now it will make a lot more sense.