在一些特定情况下,我们只需要让某个函数只执行1次或n次,比如循环或者定时执行等。
1.最简单的一种
var ifRun = true; var myFunction = function(){ if(ifRun){ console.log("i'm just do once"); ifRun = false; } } myFunction();//i'm just do once myFunction();//nothing myFunction();//nothing
2.使用apply()劫持一下再做次数判断
function justRunOnce(fn, context) { return function() { try { fn.apply(context || this, arguments) } catch (e) { //一般可以注释掉这行,否则当第一次执行之后的调用都会在控制台输出错误信息 //console.error(e) } finally { fn = null } } }; //栗子如下: var myFunction = justRunOnce(function () { console.log("i'm just do once") }); myFunction();//i'm just do once myFunction();//nothing
因为return返回函数执行一次后,fn = null将其设置未null,所以后面就不会执行了。下面是另一种写法:
function justRunOnce(fn, context) { var result; return function() { if (fn) { result = fn.apply(context || this, arguments); fn = null } return result } } //栗子如下: var canOnlyFireOnce = justRunOnce(function() { console.log('Fired!') }); canOnlyFireOnce();//Fired! canOnlyFireOnce();//nothing
3.执行指定次数
function runSthTimes(fn, n, context) { return function() { if (n--) { return fn.apply(context || this, arguments); } } } //栗子如下: var myFunction = runSthTimes(function() { console.log('success!') },3); myFunction();//success! myFunction();//success! myFunction();//success! myFunction();//nothing
有朋自远方来...评论一下呗O(∩_∩)O