,且每一个导出值为 create(method) 的执行结果,即类型为函数。...,它函数套函数,一共有三个函数,很容易就晕掉了。...在使用 koa-route 时,如 app.use(route.get('/name', name)); 中,route.get('/name', name) 的执行结果为 function (ctx,...来看一下例子: // 匹配 'Elvin' 且后面需接 ' Peng' const re1 = /Elvin(?...这里通过 Promise.resolve(fn) 的方式生成了一个异步的函数 这里补充一下 encodeURI 和 encodeURIComponent 的区别,虽然它们两者都是对链接进行编码,但还是存在一些细微的区别
,参数是req,res,next)压入路由栈,执行完毕后调用next()方法执行栈的下一个函数。...this.stack.push(layer); } return this; }; }); 复制代码 3.3 中间件种类 普通与路由中间件 普通中间件:app.use,不管是什么请求方法,只要路径匹配就执行回调函数...路由中间件:根据HTTP请求方法的中间件,路径匹配和方法匹配才执行 所以有两种Layer: 普通中间件Layer,保存了name,回调函数已经undefined的route变量。...,但没有method对象。...Route类用于创建路由中间件,并且创建拥有多个方法(多个方法是指app.get('/page',f1,f2...)中的那堆回调函数f1、f2...)的layer(对于同一个路径app.get、app.post
,参数是req,res,next)压入路由栈,执行完毕后调用next()方法执行栈的下一个函数。...this.stack.push(layer); } return this; }; }); 3.3 中间件种类 普通与路由中间件 普通中间件:app.use,不管是什么请求方法,只要路径匹配就执行回调函数...路由中间件:根据HTTP请求方法的中间件,路径匹配和方法匹配才执行 所以有两种Layer: 普通中间件Layer,保存了name,回调函数已经undefined的route变量。...路由中间件Layer,保存name和回调函数,route还会创建一个route对象 还有,中间件有父子之分: Router与Route Router类的Layer实例对象layer.route为undefined...Route类用于创建路由中间件,并且创建拥有多个方法(多个方法是指app.get('/page',f1,f2...)中的那堆回调函数f1、f2...)的layer(对于同一个路径app.get、app.post
前言 Koa 应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的。 当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件。...得到以下结果 --> 1 --> 2 --> 3 --> 4 <-- 3 <-- 2 <-- 1 中间件通过调用 next 一层层执行下去,直到没有执行权可以继续传递后,在以冒泡的形式原路返回...,并执行 next 函数之后的行为。...>{ console.log(1) next() }) router.get('/', function (ctx) { ctx.body="Hello koa"; }) 3.错误处理中间件...); 第三个为可选配置选项,这里我设置过期时间为一小时; 详细用法可以到npm上查看。
,回调函数有什么缺点,Promise又是怎么改善这些缺点 回调函数 众所周知,JS是单线程的,因为多个线程改变DOM的话会导致页面紊乱,所以设计为一个单线程的语言,但是浏览器是多线程的,这使得JS同时具有异步的操作...你使用的第三方ajax库还有可能并没有提供一些错误的回调,请求失败的一些错误信息可能会被吞掉,而你确完全不知情 总结一下回调函数的一些缺点 多重嵌套,导致回调地狱 代码跳跃,并非人类习惯的思维模式 信任问题...,你不能把你的回调完全寄托与第三方库,因为你不知道第三方库到底会怎么执行回调(多次执行) 第三方库可能没有提供错误处理 不清楚回调是否都是异步调用的(可以同步调用ajax,在收到响应前会阻塞整个线程,会陷入假死状态...3、第三方库可能没有提供错误处理 Promise的then方法会接受2个函数,第一个函数是这个Promise实例被resolve时执行的回调,第二个函数是这个Promise实例被reject时执行的回调...当传入的参数为undefined时才使用函数的默认值(显式传入undefined也会触发使用函数默认值,传入null则不会触发) 在举个例子: ?
,二次加载脚本时直接从缓存中获取 ESM:import命令加载变量不会被缓存,而是成为一个指向被加载模块的引用 循环加载 CommonJS:只输出已经执行的部分,还未执行的部分不会输出 ESM:需开发者自己保证真正取值时能够取到值...catch():指定发生错误时的回调函数 Promise.all():将多个实例包装成一个新实例,返回全部实例状态变更后的结果数组(齐变更再返回) Promise.race():将多个实例包装成一个新实例...,无法中途取消 不设置回调函数,内部抛错不会反应到外部 当处于pending时,无法得知目前进展到哪一个阶段 实例状态变为resolved或rejected时,会触发then()绑定的回调函数 resolve...yield命令就会暂时退出堆栈(但并不消失),所有变量和对象会冻结在当前状态,等到对它执行next()时,这个上下文环境又会重新加入调用栈,冻结的变量和对象恢复执行 方法异同 相同点:next()、throw...:是否存在对象属性(不存在返回undefined且不再往下执行) [x] 空判断操作符(??):是否值为undefined或null,是则使用默认值 函数扩展 [x] 函数部分执行:复用函数功能(?
options.jsonpCallback, // jsonpCallback可以是一个函数或者一个字符串 // 是函数时,执行该函数拿到其返回值作为callback函数 //...我们先来看看针对上面的例子我们发送请求的url最终会变成什么样子,而参数处理正是为了得到这条url 传了jsonpCallback时的url http://www.abc.com/api/xxx?...,,导致后端返回数据时执行该函数,就干了一件事,就是把数据赋值给了responseData这个变量。...,我们知道我们是可以不传入success函数的,当我们指定jsonpCallback的时,请求成功同样会走jsonpCallback函数,但是好像ajaxSuccess没有执行这个函数,具体在处理的呢?...load error的回调,当这句话执行的时候,Zepto1497193562723被设置成了undefined,当然后端返回数据的时候去执行 Zepto1497193562723({xxx: 'yyy
options.jsonpCallback, // jsonpCallback可以是一个函数或者一个字符串 // 是函数时,执行该函数拿到其返回值作为callback函数 //...❞ 我们先来看看针对上面的例子我们发送请求的url最终会变成什么样子,而参数处理正是为了得到这条url 「传了jsonpCallback时的url」 http://www.abc.com/api/xxx...,,导致后端返回数据时执行该函数,就干了一件事,就是把数据赋值给了responseData这个变量。...,我们知道我们是可以不传入success函数的,当我们指定jsonpCallback的时,请求成功同样会走jsonpCallback函数,但是好像ajaxSuccess没有执行这个函数,具体在处理的呢?...load error的回调,当这句话执行的时候,Zepto1497193562723被设置成了undefined,当然后端返回数据的时候去执行 Zepto1497193562723({xxx: 'yyy
通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。...现在正是腾讯云的域名金秋盛惠,最低仅需1元起。也可以在购买云服务器时进行加购减免,比正常价格要便宜50%哦。...我们传递给route.get()方法的两个参数是路由和生成器函数(我们还没有定义),它告诉路由该做什么。因此,我们必须定义一个* index()生成器和一个* about()生成器。...回到设置我们的简单生成器,当我们点击我们设置的'/'和'/ about'路由时,我们的应用程序实际上可以执行某些操作。我们不会改变任何东西,因此在这个演示中,它们的行为与常规函数非常相似。...您可能会想,“如果我们不像生成器那样使用它们,那么我们不能只传递一个常规函数吗?”嗯,不完全是。route.get()似乎在等待一个生成器,如果您尝试给它一个常规函数,它将抛出500错误。
Null和undefined区别 * Null代表空值,代表一个空对象指针;undefined表明变量声明了却未被初始化 * 用typeof判断时,typeof(undefined)能够得到undefined...类型,但typeof(null)为object * 转换时数值不一样,Number(undefined)为NaN,Number(null)为0 * Null一般用于释放内存空间/原型链顶端,当函数没有返回值时...* promise的api promise.then()成功时的回调 promise.catch()失败时的回调 promise.finally()无论promise处于什么状态都会执行 *...其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。 。最后,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。...promise.all //并发处理多个异步任务,所有任务都执行完成才能得到结果。 。promise.race // 并发处理多个异步任务,只有有一个完成就能得到相应结果。 。
Promise实例5、finally方法不管Promise状态如何都会执行,该方法的回调函数不接受任何参数6、Promise.all()方法将多个多个Promise实例,包装成一个新的Promise实例...3)Promise缺点1、无法取消Promise,一旦新建它就会立即执行,无法中途取消。2、如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。...(可选): 当执行回调函数 callback 时,用作 this 的值。...thisArg(可选): 执行 callback 时,用于 this 的值。返回值:数组中有至少一个元素通过回调函数的测试就会返回 true;所有元素都没有通过回调函数的测试返回值才会为 false。...注意:all和race传入的数组中如果有会抛出异常的异步任务,那么只有最先抛出的错误会被捕获,并且是被then的第二个参数或者后面的catch捕获;但并不会影响数组中其它的异步任务的执行。
103 },100); 输出结果如图5-3所示: 图5-3 Set示例输出结果 从输出结果可以看出因为Set对象并没有区分键与值所以输出的结果是相同的,另外需要注意的是forEach中的回调函数带参数时不能使用箭头函数...ES6之前常常使用Object当作键值对集合使用,但Object只能是String与Symbol作为键,而ES6中新增加的Map的键可以是任意值,包括函数、对象或任意基本类型;Map中的key是有序的。...//直接导出值是错误的 export 3.14; var i=100; //这里会被认为是导出声明,但i没正确声明,如果想以集中方式导出则这里需要加大括号 export i; 正确的导出方式应该如下脚本所示.../"开始;不需要将所有成员导入,但导入的成员必须在导出模块中定义且名称一致,否则将报语法错误。当然可以使用as将导入的成员重命名。...让回调函数变成了链式调用,避免了层层嵌套,使程序流程变得清晰,并为一个或者多个回调函数抛出的错误通过catch方法进行统一处理。
同时还为模块创造了命名空间,防止函数的命名冲突。 导出(export) ES6允许在一个模块中使用export来导出多个变量或函数。...export const sqrt =Math.sqrt;//导出常量 ES6将一个文件视为一个模块,上面的模块通过 export 向外输出了一个变量。一个模块也可以同时往外面输出多个变量。...() Object.values()是一个与 Object.keys()类似的新函数,但返回的是Object自身属性的所有值,不包括继承的值。...RenderContent(ret); }) .catch((error) => { // 本例中会执行到这个回调 // error: {code: 500, msg: "服务异常"}...而这些按需执行逻辑资源都体现在某一个事件回调中去加载。
被引用或拷贝时,会创建一个完全相等的变量;引用类型存储在堆内存。存储的是地址,多个引用指向同一个地址。Q2: 你知道哪些判断数据类型的方法?...__proto__.a复制代码打开你的控制台,输入以下,你会得到:图片所以得到结论:null 可以是顶层对象Object的上层描述,但null也是‘objcet’,因为null在Object的链上。...new、apply、call、bind 的实现new如果你【new】 一下,会经历:创建一个新对象(Object);将构造函数的作用域赋给新对象(也就是 this 要指向新对象);执行构造函数中的代码(...但实际上这个过程背地里要做以下三件事情。...那么,当你需要回答这个问题的时候,请回答这两句话。 回答的时候记得要保持十分沉稳的态度!
内存生命周期 分配小内存空间, 得到它的使用权 存储数据, 可以反复进行操作 不需要时释放/归还小内存空间 释放内存 为执行函数分配的栈空间内存(局部变量): 函数执行完自动释放 存储对象的堆空间内存...自己定义的 没有直接调用 但它最终执行了(在一定条件下或某个时刻) 常用的回调函数 dom事件回调函数 定时器回调函数 ajax请求回调函数 生命周期回调函数 函数也是对象 instanceof Object...js引擎自动沿着这个原型链查找, 如果最终没找到, 返回undefined 当给对象属性赋值时不会使用原型链, 而只是在当前对象中进行操作 函数的显示原型指向的对象默认是空Object实例对象(但Object...当程序运行需要的内存超过了剩余的内存时, 就出抛出内存溢出的错误 内存泄露 占用的内存没有及时释放 内存泄露积累多了就容易导致内存溢出 常见的内存泄露: 意外的全局变量 没有及时清理的计时器或回调函数...当事件发生时, 管理模块会将回调函数及其数据添加到回调列队中 只有当初始化代码执行完后(可能要一定时间), 才会遍历读取回调队列中的回调函数执行 ---- # H5 Web Workers Web
注意const虽然也可以创建块作用域,但有别不let,其值是固定的常量,任何对其值的修改都会引起错误 作用域提升: 概念:就是在作用域范围内,不管内部的变量与函数声明在何处,当执行到这个作用域时,...window,node环境中就是指向global 严格模式时,函数调用时词法作用域内的this指向 undefined,报 TypeError错误 优先级: p3(最低) 隐式绑定 概念: 当函数在某个上下文对象中调用时...Promise调用实现 优点: 解决回调地狱, 对异步任务写法更标准化与简洁化 缺点: 首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消; 其次,如果不设置回调函数,Promise内部抛出的错误...name 或者 export age 时,导入就用 import people, { name, age } // 5.当一个文件里出现 n 多个 export 导出很多模块,导入时除了一个一个导入...什么情况会阻塞渲染 js脚本同步执行 css和图片虽然是异步加载, 但js文件执行需依赖css, 所以css也会阻塞渲染 11.
A可以判断A是否为B的原型,但constructor检测 Object与instanceof不一样,还可以处理基本数据类型的检测。...(1)回调函数模式:将需要异步执行的函数作为回调函数执行,其缺点在于处理复杂逻辑异步逻辑时,会造成回调地狱(回调嵌套层数太多,代码结构混乱); (2)事件监听模式:采用事件驱动的思想,当某一事件发生时触发执行异步函数...Promise的缺点有如下三个缺点: (1)Promise一旦执行便无法被取消; (2)不可设置回调函数,其内部发生的错误无法捕获; (3)当处于pending状态时,无法得知其具体发展到了哪个阶段...)或.then(undefined, rejection)的别名,用于指定发生错误时的回调函数。...promise、async异步函数的回调会被推入到微任务队列中,当执行栈被清空且异步操作完成时立即执行。 24. require/import之间的区别?
在块外,当我们打印变量时,我们得到的是10而不是之前分配的值,这是因为块外,内部变变量i是不存在的。...执行上述代码,输出如下: ? 调用reject函数会抛出一个错误,但是我们没有添加用于捕获错误的代码。 需要调用catch方法指定的回调函数来捕获并处理这个错误。...所以建议大家在使用promise时加上catch方法,以此来避免程序因错误而停止运行。...我们在每个文件中声明的变量和函数不能用于其他文件,除非我们将它们从该文件中导出并、在另一个文件中得到引用。 因此,在文件中定义的函数和变量是每个文件私有的,在导出它们之前,不能在文件外部访问它们。...但是,你可以在一个文件中使用多个命名导出和一个默认导出。