两道关于JS的小考题(闭包与中间件)
题目一:写一个javascript函数 calculate,该函数有如下性质
calculate() = 0;
calculate(2)() = 2;
calculate(3)(4)(1)(5)() = 13;
即可以连续地链式调用,一旦碰到一次调用没有参数的,则返回前面所有参数的和。
其实题目本身并不算复杂,代码也非常简单,就是思路有点绕,可能要在电脑上反复试试调调才能写对,答案如下:
var calculate = (function () {
var sum = 0;
var func = function () {
if (arguments.length === 0) {
var ret = sum;
sum = 0;
return ret;
}
sum += arguments[0];
return func;
};
return func;
})();
console.log(calculate()); // 输出0
console.log(calculate(100)()); // 输出100
console.log(calculate(1)(2)(3)(4)()); // 输出10
主要思路就是用闭包变量记录当前的结果,所写的函数一旦没有参数,就返回数字结果,一旦有一个参数,记录下当前的和,然后返回函数自己。
题目二:有一个JS函数,函数名为APP,它满足如下性质:
var func1 = function (next) {
console.log('func1 begin');
next();
console.log('func1 end');
};
var func2 = function (next) {
console.log('func2 begin');
next();
console.log('func2 end');
};
var func3 = function (next) {
console.log('func3 begin');
next();
console.log('func3 end');
};
var a = new APP();
a.use(func1);
a.use(func2);
a.use(func3);
a.run();
// output:
// func1 begin
// func2 begin
// func3 begin
// func3 end
// func2 end
// func1 end
有点类似于中间件一样,APP实例化以后,可以用use方法注册一系列函数,并通过run方法依次把注册的函数跑一遍,注册的函数都接受一个next函数作为参数,一旦碰到next执行,则递归调用下一个注册函数。请写出APP这个函数的实现。
刚看到这个题目的时候有点蒙圈,感觉无从下笔,思考了很久以后发现……原来这么简单……自己把自己绕进去了。答案如下:
var APP = function() {
this.stack = [];
};
APP.prototype.use = function (cb) {
this.stack.push(cb);
};
APP.prototype.run = function() {
var self = this;
var next = function () {
if(self.stack.length < 1) {
return;
}
var cb = self.stack.shift();
cb(next);
};
next();
};
两道关于JS的小考题(闭包与中间件)的更多相关文章
- js 从两道面试题加深理解闭包与箭头函数中的this
壹 ❀ 引 在本文之前我已经花了两个篇幅专门介绍了JavaScript中的闭包与this,正好今早地铁上看到了两道面试题,试着做了下发现挺有意思,所以想单独写一篇文章来记录解析过程.若你对于闭包与t ...
- JS之作用域与闭包
JS之作用域与闭包 作用域在JS中同样也是一个重要的概念.它不复杂,因为ES5中只有全局作用域和函数作用域,我们都知道他没有块级作用域.但在ES6中多了一个let,他可以保证外层块不受内层块的影响 ...
- 撸一个JS正则小工具
写完正则在浏览器上检测自己写得对不对实在是不方便,于是就撸了一个JS正则小demo出来. demo demo展示 项目地址 代码部分 首先把布局样式先写好. <!DOCTYPE html> ...
- JAVA算法两道
算法(JAVA)----两道小小课后题 LZ最近翻了翻JAVA版的数据结构与算法,无聊之下将书中的课后题一一给做了一遍,在此给出书中课后题的答案(非标准答案,是LZ的答案,猿友们可以贡献出自己更快 ...
- 两道面试题,带你解析Java类加载机制
文章首发于[博客园-陈树义],点击跳转到原文<两道面试题,带你解析Java类加载机制> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Gr ...
- 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)
本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...
- JS中的的"闭包"?深入Javascript之this
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...
- pixi.js 微信小游戏 入手
pixi是什么?一款h5游戏引擎 优点:简单简洁性能第一 缺点:大多数用的国产三大引擎,pixi资料少,工具少, 为什么学,装逼 用pixi开发小游戏行吗? 行.但要简单处理下 下载官网上的 weap ...
- 讲解JavaScript两个圆括号、自调用和闭包函数
一.JavaSript圆括号的使用 先来看一组通过函数声明来定义的函数: 先附代码: 运行结果如下: 这里我们可以看出: Ø 若没有加圆括号,则返回的是这个函数的内容 Ø 若加上圆括号,则返回的是 ...
随机推荐
- JSON字符串和Dictionary字典类型的相互转换
在开发过程中,往往会遇到数据类型转换的情况,根据自己的业务,可能转换类型有多种,下面就说一下json字符串和字典类型的转换. public static class JsonUntity { /// ...
- 海量IT资料 + 各种平台下的Oracle安装文件 + 公开课录像 + 各种视频教程资料
觉得老师的公开课讲的都挺好的,这里把我录的一些公开课视频分享给大家,都用的是<屏幕录像专家>来录制的,是lxe格式的,大家用这个软件来播放就可以了,后边的公开课录像文件也会慢慢添加进去的, ...
- net-snmp添加自定义MIB
我所知道的添加自定义MIB的方法有三种 1.静态加载,将生成的.c和.h文件加入到相应的位置,重新编译snmp库,优点是不需要修改配置文件,缺点是每次添加都得重新编译: 2.动态加载,将生成的.c ...
- C语言(函数)学习之strstr strcasestr
C语言(函数)学习之[strstr]&[strcasestr]一.strstr函数使用[1]函数原型char*strstr(constchar*haystack,constchar*needl ...
- 深入理解TCP(二)
上一篇http://www.cnblogs.com/whc-uestc/p/4715334.html中已经讲到TCP跟踪一个拥塞窗口来(cwnd)提供拥塞控制服务,通过调节cwnd值以控制发送速率.那 ...
- arc如何破循环或交叉引用
IOS两种常见的循环引用: 1,两个类之间互相定义对方的引用 如下: //ARC code @interface A : NSObject @property (nonatomic,strong) B ...
- 时光煮雨 Unity3d 序列目标点的移动①
系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...
- stl学习(三)crope的用法
转载自http://blog.csdn.net/iamzky/article/details/38348653 曾经我不会写平衡树……于是在STL中乱翻……学到了pb_ds库中的SXBK的斐波那契堆. ...
- jquery工具方法parseJSON
error : 自定义错误 parseJSON : 字符串转json trim : 去除字符串头尾空字符 parseJSON方法先判断参数是否为字符串,否则返回空对象,再去除字符串头尾空字符,判断是否 ...
- Html网页使用jQuery传递参数并获取Web API的数据
昨天Insus.NET有开始学习Web API,<ASP.NET MVC的Web Api的实练>http://www.cnblogs.com/insus/p/4334316.html .其 ...