js之一个有意思的逻辑题

昨天偶然看见一个技术群里面在讨论一道js的逻辑题,很快就有人给出答案来了,但是我却想了半天,这里之所以记载,不是单纯的记录一种答案,而是多种,废话不多说,直接上题目

定义一个函数,比如:var repeatFun = repeat(alert, 10, 3000),调用repeatFun(‘hellword’),会alert10次helloworld,每次间隔3s

看到这个题目,怎么样,你是直接出答案吗?好吧,趁着还没忘记,我这里先记录一下我开始写这道题的感受吧,首先呢,看到这道题,前面半句我没看懂,我知道它想让我lert10次helloWord,每次间隔3s,这是我读题所知道的需求。但是我的神一样的理解竟然变成了这样:(哦,这是要我每间隔三秒alert10次HelloWord,好吧,然后这就是我的神逻辑,一直陷入死循环出不来,
好了不开玩笑了,还是言归正传的记录答案。

首先呢,一位对es6语法很熟悉的大佬很快速的给出了答案,然后获得了无数点赞,让我们来看看神一样的答案吧!

es6解题思路:

 ((str)=>{let count = 0;let fn = ()=>{console.log(str+count);count++;if(count<10) setTimeout(fn,3000)}fn()})('hellword')

怎么样是不是很快,但是好吧,也许你会说,我还没有掌握es6语法呀,或者你想说,我们的项目里面还没有用到es6语法呀,怎么办呢。好吧,没多大事,因为我就是没有太掌握es6的语法,但是好在我能看懂es6,所以我将它翻译成es5写法了。下面就来看看翻译后的答案吧!

es5解题思路:

 function test(aa) {var i=0;function test02() {console.log(aa+i);i++;if(i<10) setTimeout(test02,3000)}test02();}test('helloword');

好了,看到这里,本来以为,嗯差不多了,就是这样,但是后来大佬又来了一种方法,我个人觉得很简单明了,是什么呢,你猜到了吗,好吧,直接说吧,就是递归。如果暂时不给答案,你是否能用递归的思想做出来呢。好了这里直接出答案吧!

递归解题思路:

    const repeat = (msg, count) => {setTimeout(() => {console.log(msg);count < 9 && repeat(msg, count + 1)}, 3000);}repeat('helloword',0)

下面给它翻译成普通写法:

function rr(ww,i) {setTimeout(function () {console.log(ww+i);if(i<9){rr(ww,i+1);}},1000)}rr('helloword',0);

还有一种方法,就是用到for循环,先看一下,我用for循环写的答案吧!

用for循环解题思路:

function test(qq,count,e) {for(var i=0;i<count;i++){test02(qq,i,e);}
}
function test02(a,bcount,c) {setTimeout(function () {console.log(a+bcount);},bcount*c)
}
test('helloword',10,3000);

ok,看完上面这个,我搜集到了一个大佬的另外一种解法,他给他取了一个名字,柯里化解法,好,下面直接上代码吧!如果有不懂柯里化是啥意思的小伙伴,这里提供一个链接解释吧!http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

柯里化解法:

function repeat(alert, count, duration) {
return text => {
for (let i = 0; i < count; i++) {
setTimeout(() => {
alert(text)
},duration * i)
}
}
}var repeatFun = repeat(alert, 3, 3000)
repeatFun('hellword')

上面是大佬的源代码,未经改动,下面为了不懂es6的朋友着想,也为了自己更好理解,我给他翻译成普通函数的写法。

柯里化普通函数写法:

function test(count,dur) {return function test02 (text) {for(let i=0;i<count;i++){setTimeout(function () {console.log(text+i);},dur * i)}}
}
test(10,3000)('helloword');

好了一个题目引发出来了很多知识点,感觉还是比较有意思的,这里不多说了,感兴趣的朋友还是去了解一下柯里化吧。另外结尾了丢一段代码出来,思考一下两者结果为何不同吧!

function test(count,dur) {return function test02 (text) {for(var i=0;i<count;i++){setTimeout(function () {console.log(text+i);},dur * i)}}
}
test(10,3000)('helloword');

没错,这是我上面那段代码的一点点小改变,但是结果却是不同的哦。

js之一个有意思的逻辑题相关推荐

  1. 转载:一道逻辑题 房间里有100盏电灯

    转自:程序猿_哲 一道挺有意思的逻辑题 房间里有100盏电灯,编号为1,2,3--100,每盏灯上有一个按钮,初始时灯全都是关的.        编好号的100位同学由房间外依次走进去,将自己编号的倍 ...

  2. 函数和数组,字符串逻辑题

    函数和数组逻辑题 函数 预解析 递归求兔子序列 数组 选项卡 全选和反选 点击更换背景颜色 简易日历 30个整型元素的数组,每五个数求出一个平均值,存入新数组 二维数组 找出数组中小于10 的数据 编 ...

  3. 刷1000遍奥数题,不如学会这几道逻辑题,让孩子秒懂数学,学习早开窍!

    ▲ 点击查看 前阵子发现一个英国BBC制作的纪录片,叫<逻辑的乐趣>(The Joy Of Logic),介绍了逻辑的概念,逻辑的发展史,及其在现实生活中的应用和价值. 讲解非常有意思,深 ...

  4. 2014百度之星资格赛 1001:Energy Conversion(水题,逻辑题)

    Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  5. 98%的人没解出的德国面试逻辑题(离散数学篇)!?

    之前一直想把二发表,但是因为某些事情一直没有发表.现在就写一下,到底怎么解和原来的那个逻辑题(其实是离散数学中的图)同一类型的题目. 上一篇的原文"题目如下:"一桶16斤的水,还有 ...

  6. 史上最难逻辑题!据说99.9%的人都做不出来……

    全世界只有3.14 % 的人关注了 爆炸吧知识 非常「逻辑」 撩人于无形 普林斯顿大学博士生 Raymond Smullyan 是一位非常厉害逻辑高手. 在Smullyan与他非常迷恋的女音乐家的第一 ...

  7. 前端面试常见逻辑题收集及分析

    前端面试中常出现一些有趣的逻辑题,初见的时候有可能会手足无措,但实际多看几个题之后就会有一定的思考逻辑,有种打通任督二脉的感觉.以下是我个人面试经历以及网络上收集来的一些经典题目. 题目: 1.现有一 ...

  8. Python基础-“百钱百鸡”入门逻辑题(刚开始的建议藏起来)

    一:前言 最近这段时间辣条哥发现学Python的人是越来越多,但是适不适合学Python又有几个人知道呢?说到底编程其实很多时候需要的是较强的思维逻辑能力,如果基础的思维逻辑能力不行的话那辣条就得好好 ...

  9. 网络中超难的75道逻辑题及答案

    网络中超难的75道逻辑题及答案 [1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. 由满6向空5倒,剩1升,把这1升倒5里,然 ...

最新文章

  1. 2020腾讯广告算法大赛:赛题理解与解题思路
  2. “重”磅!人造物质量首超全球生物量
  3. android多线程读取网页内容
  4. HBase之HFile解析
  5. Visial Studio 2019提示:namespace std 没有成员 max 的解决方法
  6. MYSQL BENCHMARK函数的使用
  7. roaringbitmap java,roaringbitmap 源码解析 bitmap add过程
  8. Maven Scope取值的含义
  9. python中的文件读取注意事项
  10. 由MindManager命令构成的实用导图
  11. 基础矩阵,本质矩阵,单应性矩阵讲解,在ORB-SLAM相机的位姿初始化的应用
  12. 目标检测->SSD算法
  13. python写字_用Python写书法作品,WOW!
  14. 混淆的艺术-(苍井空变凤姐)Proguard源码分析(一)前言和计划
  15. Visual Studio 2015 安装教程(附安装包)
  16. pr电子相册如何制作
  17. 像素是计算机图像处理的最小单元,图像处理复习
  18. D3.js 生成词云图
  19. (三)Android系统启动流程
  20. 计算机计算的应用,计算器计算

热门文章

  1. 高师培训计算机心得体会,双师型教师计算机培训心得体会
  2. 3d打印服务武汉迪万定制模型
  3. Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案
  4. 08-动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?
  5. Linux c 停车场管理系统
  6. 【小程序】微信小程序云开发笔记详细教程(建议收藏)
  7. 「游戏建模」如何展UV和设置光滑组?
  8. 写的几个函数,关键词描红,搜索关键词过滤,生成SQL查询关键词
  9. 小米电视html插口,小米电视4X无耳机接口连接有线耳机的解决方案
  10. 函数中的声明和变量的定义