两道关于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圆括号的使用 先来看一组通过函数声明来定义的函数: 先附代码: 运行结果如下: 这里我们可以看出: Ø 若没有加圆括号,则返回的是这个函数的内容 Ø 若加上圆括号,则返回的是 ...
随机推荐
- 挖一挖C#中那些我们不常用的东西之系列(1)——ToDictionary,ToLookup
这个系列我们看看C#中有哪些我们知道,但是又不知道怎么用,又或者懒得去了解的东西,比如这篇我们要介绍的toDictionary 和ToLookup. 从图中我们看到有四个ToXXX的方法,其中ToAr ...
- 【转载】CentOS 6.3下rsync服务器的安装与配置
一.rsync 简介 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录. Rsy ...
- Java并发之BlockingQueue 阻塞队列(ArrayBlockingQueue、LinkedBlockingQueue、DelayQueue、PriorityBlockingQueue、SynchronousQueue)
package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Create ...
- MaskedTextBox的聚焦和光标位置
遇到一个关于MaskedTextBox聚焦和光标居左的问题. ①. 先说说聚焦: 起初给MaskedTextBox设置了Focus(),运行之后,并没有作用. 然后又给Form添加了Load事件,又设 ...
- Cookie在IE缓存问题深度研究
最近在发布net到生产环境的时候,测试发现了问题,IE的登录无效. 同样的版本在QA环境没有遇到问题. 代码一样,chrome,firefox 都可以.就是IE不行,调试发现 登录完成,读取cooki ...
- Android学习笔记之AndroidManifest.xml文件解析(转)
//自已备注: <?xml version="1.0" encoding="utf-8"?>//说明了版本号,字符集 <manifest xm ...
- DirectX API 编程起步 #01 项目设置
=========================================================== 目录: DirectX API 编程起步 #02 窗口的诞生 DirectX A ...
- IIS中查看W3P.exe进程对应的应用程序池的方法
对于IIS6可以运行 iisapp -a来显示应用程序池的性能列表. iisapp.vbs它是一个脚本程序,在安装2003时需要SP1才有 而IIS7可以直接用它的外壳命令 C:"Windo ...
- Flex 布局教程:语法篇[转]
网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...
- web进阶之jQuery操作DOM元素&&MySQL记录操作&&PHP面向对象学习笔记
hi 保持学习数量和质量 1.jQuery操作DOM元素 ----使用attr()方法控制元素的属性 attr()方法的作用是设置或者返回元素的属性,其中attr(属性名)格式是获取元素属性名的值,a ...