js中控制函数执行1次或n次的方法
[ 2017/12/01, JavaScript , 6190阅, 0评 ]
在一些特定情况下,我们只需要让某个函数只执行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

相关资料

js只执行1次的函数示例

js如何控制函数只执行n次?

有朋自远方来...评论一下呗O(∩_∩)O