(资料图片仅供参考)
【相关推荐:javascript视频教程、web前端】
一、计时器
实现一个打点计时器,要求:
1、从 start到 end(包含 start和 end),每隔 100 毫秒 console.log一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel方法,用于停止定时操作
3、第一个数需要立即输出
function count(start, end) { console.log(start++); let timer = setInterval(() =>{ if (start <= end) { console.log(start++); } }, 100); return { cancel: () =>{ clearInterval(timer); }, };}登录后复制第一个数立即输出,console.log(start++)中start++是先输出再自加1。
之后使用setInterval定时器,count函数return出cancel,cancel内是一个清除定时器的操作(引用了timer这个在count函数中声明的变量),这里用到了闭包的知识。
cancel是一个闭包函数,它能访问count函数中的变量timer,这时这个timer不会被JS垃圾回收机制清除(会永驻内存,即使count函数被销毁),这就是可以在外部调用cancel清除timer这个定时器的原因。
二、流程控制
实现 fizzBuzz函数,参数 num与返回值的关系如下: 1、如果 num能同时被 3 和 5 整除,返回字符串 fizzbuzz2、如果 num能被 3 整除,返回字符串 fizz3、如果 num能被 5 整除,返回字符串 buzz4、如果参数为空或者不是 Number类型,返回 false5、其余情况,返回参数 num
示例:
输入:15输出:fizzbuzz
登录后复制这就是简单的分支判断:
function fizzBuzz(num) { if (!num || typeof num !== "number") return false; if (num % 3 === 0 && num % 5 === 0) return "fizzbuzz"; if (num % 3 === 0) return "fizz"; if (num % 5 === 0) return "buzz"; return num;}登录后复制三、闭包应用
实现函数 makeClosures,调用之后满足如下条件: 1、返回一个函数数组 result,长度与 arr相同 2、运行 result中第 i个函数,即 result[i](),结果与 fn(arr[i])相同
示例:
var arr = [1, 2, 3];var fn = function (x) { return x * x;};var result = makeClosures(arr, fn);result[1]() === fn(arr[1]) ? console.log("yes") === 4 : console.log("no"); // yes登录后复制解:
function makeClosures(arr, fn) { const result = [] arr.forEach(item=>{ result.push(function(){ return fn(item) }) }) return result}登录后复制这题一眼看上去感觉是比较绕,但你从上到下去梳理就很容易找到解决的方法:
makeClosures返回一个数组数组中每个元素都是一个函数并且这些函数执行的结果要与使用arr中对应元素作为参数调用fn的结果一致四、arguments剩余参数
函数 useArguments可以接收 1 个及以上的参数。请实现函数 useArguments,返回所有调用参数相加后的结果。本题的测试参数全部为 Number类型,不需考虑参数转换。
输入:1, 2, 3, 4输出:10
登录后复制解:
function useArguments() { return [...arguments].reduce((a, b) =>a + b);}登录后复制函数中能直接访问arguments变量,这个变量是一个含有该函数接收的所有参数的伪数组(不具有数组的全部方法)。
所以我是先使用...解构来将arguments转换成一个真正的数组,之后调用数组的reduce求和方法进行求和即可。
reduce()方法对数组中的每个元素按序执行一个由您提供的 reducer函数,每一次运行 reducer会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。
Array.prototype.reduce(callbackFn, initialValue)
登录后复制参数:
callbackFn一个 “reducer” 函数,包含四个参数:
previousValue:上一次调用 callbackFn时的返回值。在第一次调用时,若指定了初始值 initialValue,其值则为 initialValue,否则为数组索引为 0 的元素 array[0]。currentValue:数组中正在处理的元素。在第一次调用时,若指定了初始值 initialValue,其值则为数组索引为 0 的元素 array[0],否则为 array[1]。currentIndex:数组中正在处理的元素的索引。若指定了初始值initialValue,则起始索引号为 0,否则从索引 1 起始。array:用于遍历的数组。initialValue可选 作为第一次调用 callback函数时参数 previousValue的值。若指定了初始值 initialValue,则 currentValue则将使用数组第一个元素;否则 previousValue将使用数组第一个元素,而 currentValue将使用数组第二个元素。
五、二次封装函数
实现函数 partialUsingArguments,调用之后满足如下条件: 1、返回一个函数 result2、调用 result之后,返回的结果与调用函数 fn的结果一致 3、fn的调用参数为 partialUsingArguments的第一个参数之后的全部参数以及 result的调用参数
解:
function partialUsingArguments(fn) { const arr = [].slice.call(arguments,1) return function (...arr2) { // ...arr2表示用arr2接收所有参数,arr2是一个数组 return fn(...arr,...arr2) }}登录后复制第一个arr数组表示的是partialUsingArguments接收的第一个参数之后的全部参数数组。
因为arguments是伪数组,不具有slice方法,所以这里通过随便一个数组(我选的是空数组[])来调用slice,然后通过call修改调用的这个slice的this指向,使其指向到arguments,这样就相当于是在arguments上使用slice方法。
【相关推荐:javascript视频教程、web前端】
以上就是JavaScript五个常用功能示例(总结分享)的详细内容,更多请关注php中文网其它相关文章!

























































