Вы не можете реально кэшировать замыкание . Если вы это сделаете, то он по-прежнему закрывает переменные функции, которую он впервые определил.
Например, вы можете подумать о том, чтобы сделать это, что на первый взгляд может показаться нормальным:
var newUser = (function() {
var doSomethingCool;
function newUser(user){
doSomethingCool = doSomethingCool || function(){console.log(user);};
doSomethingCool();
}
return newUser;
}());
При первом вызове newUser
будет создана функция doSomethingCool
. Это вывод:
> newUser('foo')
foo
Когда мы вызываем функцию во второй раз, замыкание используется повторно. Это вывод:
> newUser('bar')
foo
Почему? Поскольку замыкание только закрывает переменные функции , вызов был определен в.
Если вы действительно хотите «кэшировать» функцию, вы должны ее параметризовать:
var newUser = (function() {
var doSomethingCool;
function newUser(user){
doSomethingCool = doSomethingCool || function(user){console.log(user);};
doSomethingCool(user);
}
return newUser;
}());
Но я бы не назвал это закрытием. Технически это является закрытием, но вы не используете это свойство.
И на самом деле, гораздо проще написать это так:
var newUser = (function() {
var doSomethingCool = function(user){...};
function newUser(user){
doSomethingCool(user);
}
return newUser;
}());