龙空技术网

几个有趣的js函数

萌宠猫咪笔记 1128

前言:

而今姐妹们对“js尾递归”大体比较注重,小伙伴们都需要分析一些“js尾递归”的相关资讯。那么小编同时在网络上收集了一些有关“js尾递归””的相关资讯,希望兄弟们能喜欢,咱们一起来学习一下吧!

函数节流:水龙头与弹簧

函数节流(Throttle)是指限制一个函数在一定时间内只能执行一次。

Throttle:这种方式是类似水龙头,当水滴足够大时水滴就会掉下来;或者地铁过闸机,每个人进入3秒后闸门关闭;类似的,当时间超过某个timeout的时候就执行函数

var throttle = function(fn, timeout) { var last = new Date().getTimes(); return function() { var curr = new Date().getTimes(); if (curr - last >= timeout) { fn.apply(this, arguments); } };};

忽然想到一个问题,如果需要节流的是scroll事件,如果滚动的时间超短上面函数岂不是不能执行了,那就这样实现:

var throttle = function(fn, timeout, delay) { var timer = null, last = new Date().getTimes(); return function() { var curr = new Date().getTimes(), context = this, args = arguments; if (curr - last >= timeout) { clearTimeout(timer); timer = null; last = curr; fn.apply(context, args); } else { timer = setTimeout(function() { fn.apply(this, arguments); }, delay); } };};// 上面这一串代码居然需要我手动缩紧,也是醉了

函数防抖(debounce)是指若干函数调用合成为一次,并在给定时间过去之后,或者连续事件完全触发完成之后,调用一次。

Debounce:bounce是反弹的意思,debouce就是不让弹,就像弹簧一样,你一直按着它,直到放手它才能弹起来;这种思想拿到节流来说就是:如果你一直滚动,那函数就一直不响应,直到你不滚动我才执行:

var debounce = function(fn, delay) { var timer = null; return function() { var context = this, args = arguments; clearTimeout(timer); timer = setTimeout(function() { fn.apply(context, args); }, delay); };};
尾递归优化

递归就是一个函数直接或间接地调用自身,是为直接或间接递归。

尾递归

  顾名思义,尾递归就是从最后开始计算, 每递归一次就算出相应的结果, 也就是说, 函数调用出现在调用者函数的尾部, 因为是尾部, 所以根本没有必要去保存任何局部变量. 直接让被调用的函数返回时越过调用者, 返回到调用者的调用者去。尾递归就是把当前的运算结果(或路径)放在参数里传给下层函数,深层函数所面对的不是越来越简单的问题,而是越来越复杂的问题,因为参数里带有前面若干步的运算路径。

Trampoline:蹦床函数。这个函数的作用是把递归通过循环实现。

function trampoline(fn) { while (f && f instanceof Function) { f = f(); } return f; } function sum(x, y){ if (y > 0) { return sum.bind(null, x+1, y-1); } else { return x; }}trampoline(sum(1,100000));
function tco(fn) { var value, active = false, accumulated = []; return function accumulator() { accumulated.push(arguments); // console.log(active); if (!active) { active = true; while (accumulated.length) { value = fn.apply(this, accumulated.shift()); } console.log(value); active = false; return value; } };}var sum = tco(function(x, y) { if (y > 0) { return sum(x+1, y-1); } else { return x; }});console.log(sum(1, 10000));

标签: #js尾递归 #js函数例子