Это функция, которая «держит» ссылку или ссылки на что-то в другой области видимости. Например:
var myArrayOfFunctions = [];
for(var i = 0; i<3: i++)
{
//Note how the function being defined uses i,
//where i lives in the parent's scope, this creates a closure
myArrayOfFunctions[i] = function(a) { return a + i;}
}
myArrayOfFunctions[0](5); //Prints 8 WTF!
myArrayOfFunctions[1](5); //8 again
myArrayOfFunctions[2](5); //Well, this 8 was expected
Это происходит потому, что когда функции «созданы», они не копируют значение i, они содержат ссылку на i, поэтому, когда мы вызываем функции, они используют текущее значение i, равное 3.
Вот графическое объяснение.