, чтобы в полной мере использовать замыкания, я предлагаю вам обернуть вашу основную функцию в другую функцию, которая вызывает флаг "run":
function initRun(){
var ran = ran || false;
return function(arguments){
if(ran)
{
console.log("can't run any more!");
return;
}
ran = true;
console.log("i'm running!");
/* your logic here */
}
}
var run = initRun();
тогда вы можете проверить это, вызывая вашу функцию так, как вам нужно:
run();
run.call();
run.apply();
он успешно запускается только один раз, независимо от используемого метода вызова.
Минус-минус в том, что вам нужна дополнительная функция, которая оборачивает вашу первоначальную функцию запуска, но я думаю, что это более надежно и элегантно, чем использование глобального флага, который отслеживает ваши вызовы функций