在我們?nèi)粘i_發(fā)的時候,經(jīng)常會碰到一種這樣的情況:想讓某個函數(shù)只執(zhí)行一次,特別是在一些循環(huán)或定時執(zhí)行的時候。
廢話不多說,直接上代碼:
function runOnce(fn, context) { //控制讓函數(shù)只觸發(fā)一次 return function () { try { fn.apply(context || this, arguments); } catch (e) { console.error(e);//一般可以注釋掉這行 } finally { fn = null; } }} // Usage 1:var a = 0;var canOnlyFireOnce = runOnce(function () { a++; console.log(a);}); canOnlyFireOnce(); //1canOnlyFireOnce(); // nothingcanOnlyFireOnce(); // nothing // Usage 2:var name = "張三";var canOnlyFireOnce = runOnce(function () { console.log("你好" + this.name);});canOnlyFireOnce(); //你好張三canOnlyFireOnce(); // nothing // Usage 3:var obj = {name: "天涯孤雁", age: 24};var canOnlyFireOnce = runOnce(function () { console.log("你好" + this.name);}, obj);canOnlyFireOnce(); //你好天涯孤雁canOnlyFireOnce(); // nothing因為返回函數(shù)執(zhí)行一次后,fn = null將其設(shè)置未null,所以后面就不會執(zhí)行了。再貼一個網(wǎng)上別人分享的代碼,道理一樣的:
function once(fn, context) { var result; return function() { if(fn) { result = fn.apply(context || this, arguments); fn = null; } return result; };} // Usagevar canOnlyFireOnce = once(function() { console.log('Fired!');}); canOnlyFireOnce(); // "Fired!"canOnlyFireOnce(); // nothing以上就是為大家整理讓javascript只執(zhí)行一次的函數(shù)示例,有需要的可以參考。
新聞熱點
疑難解答