JavaScript如何控制函数的执行次数。

发布于 2022-09-01 20:43:30 字数 194 浏览 15 评论 0

var foo = function(){alert('called!')};

time(foo,2);

foo();//弹出called
foo();//弹出called
foo();//do nothing

time 的第一个参数是传入一个函数 第二参数是函数执行的次数 就是如何控制传入的函数的执行次数?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

美羊羊 2022-09-08 20:43:30
var foo = function () {
    alert('called!')
};

function time(fn, times) {
    var callTimes = 1;

    return function () {
        if (callTimes > times)return;
        callTimes++;
        fn();
    }
}

var fooT = time(foo, 2);

fooT();//弹出called
fooT();//弹出called
fooT();//do nothing
嘿看小鸭子会跑 2022-09-08 20:43:30

var foo = (function (){
var i = 0;
return function (){

if (i <2) alert ('called');
i++;

}
})();

手机敲的,意思到了就行

晨光如昨 2022-09-08 20:43:30

不返回新的函数的话

var foo = function () {
    console.log('old');
};

time(foo, 2);

foo();//弹出called
foo();//弹出called
foo();//do nothing

function time(foo, times) {
    return window.foo = function () {
        if (times-- > 0) {
            foo();
        }
        else
            return;
    };
}

估计不对,坐求正解,大神轻喷

扭转时空 2022-09-08 20:43:30

var foo = function(){alert('called!')};

function time(foo,count)
{

for (var i = 0; i < count; i++) {
    foo();
}

}

time(foo, 2);

foo();//弹出called
foo();//弹出called
foo();//do nothing

想你只要分分秒秒 2022-09-08 20:43:30

如果要包装的是函数,而不是匿名函数表达式,并且需要改变原函数,可以下面这么写

function foo() {
    alert('called!');
}
var getFnName = function(callee) {
    return callee.name || callee.toString().match(/function\s*([^(]*)\(/)[1];
};
var time = function(fn, times) {
    var origin = fn,
        tick = 0;
    window[getFnName(fn)] = function() {
        if(tick < times) {
            origin.apply(this, arguments);
            tick++;
        }
    };
};

time(foo, 2);
foo();
foo();
foo();

but,其他情况就像@小_秦 说的,实现不了而且这也不是一个好的解决方案。

dawn曙光 2022-09-08 20:43:30

DON'T reinvent your own bicycle!
underscorejs's before function is exactly what you are looking for. here's source code: link

  _.before = function(times, func) {
    var memo;
    return function() {
      if (--times > 0) {
        memo = func.apply(this, arguments);
      }
      if (times <= 1) func = null;
      return memo;
    };
  };
﹏半生如梦愿梦如真 2022-09-08 20:43:30

君不知道 underscore的

after

方法吗?
而且也是很简单的吧,朴灵的那本书都实现了好几个呢,嗯,第四章。

夜空下最亮的亮点 2022-09-08 20:43:30

经提醒,发现是我理解错了。现在有点忙,有时间再看看。问题关注中~

我怎么就看不懂楼上这些童鞋码代码的时候心里在想啥呢?明明很简单的东西,弄的这么复杂。

function time(fn, count) {
fn();
count --;
if (!count) return;
time(fn, count);
}

测试传送门:runjs

根本不需要创建新的Function对象,也不需要暴露在window下,
就这么一个简单的递归就可以做到了,代码逻辑也根本一点不复杂。
而且我这只是单纯的把题主的需求翻译成代码而已。
真不知道楼上各位大神咋想的。。

薯片软お妹 2022-09-08 20:43:30
var foo = function() { alert('called'); };
function time(fn,count) {
    foo = function(){
        if(count-- > 0) {
            fn(this);
        }
    };
}

time(foo,2);

foo();//called
foo();//called
foo();//do nothing
再见回来 2022-09-08 20:43:30

类似单例模式。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文