有时我们会忽视缺点处理和客栈追踪的一些细节, 然则这些细节对于写竽暌闺测试或缺点处理相干的库来说是异常有效的. 例如这周, 对于 Chai 就有一个异常棒的PR, 该PR极大年夜地改良了我们处理客栈的方法, 当用户的断言掉败的时刻, 我们会赐与更多的提示信息(赞助用户进行定位).
合理地处理客栈信息能使你清除无用的数据, 而只专注于有效的数据. 同时, 当更好地舆解 Errors 对象及其相干属性之后, 能有助于你更充分地应用 Errors.
(函数的)调用栈是怎么工作的
在谈论缺点之前, 先要懂得下(函数的)调用栈的道理:
当有一个函数被调用的时刻, 它就被压入到客栈的顶部, 该函数运行完成之后, 又会大年夜客栈的顶部被移除.
客栈的数据构培养是落后先出, 以 LIFO (last in, first out) 著称.
例如:
- function c() {
- console.log('c');
- }
- function b() {
- console.log('b');
- c();
- }
- function a() {
- console.log('a');
- b();
- }
- a();
在上述的示例中, 当函数 a 运行时, 其会被添加到客栈的顶部. 然后, 当函数 b 在函数 a 的内部被调用时, 函数 b 会被压入到客栈的顶部. 当函数 c 在函数 b 的内部被调用时也会被压入到客栈的顶部.
当函数 c 运行时, 客栈中就包含了 a, b 和 c(按此次序).
当函数 c 运行完毕之后, 就会大年夜客栈的顶部被移除, 然后函数调用的┞菲握流就回到函数 b. 函数 b 运行完之后, 也会大年夜客栈的顶部被移除, 然后函数调用的┞菲握流就回到函数 a. 最后, 函数 a 运行完成之后也会大年夜客栈的顶部被移除.
为了更好地在demo中演示客栈的行动, 可以应用 console.trace() 在控制台输出当前的客栈数据. 同时, 你要以大年夜上至下的次序浏览输出的客栈数据.
- Trace
- at c (repl:3:9)
- at b (repl:3:1)
- at a (repl:3:1)
- at repl:1:1 // <-- For now feel free to ignore anything below this point, these are Node's internals
- at realRunInThisContextScript (vm.js:22:35)
- at sigintHandlersWrap (vm.js:98:12)
- at ContextifyScript.Script.runInThisContext (vm.js:24:12)
- at REPLServer.defaultEval (repl.js:313:29)
- at bound (domain.js:280:14)
- at REPLServer.runBound [
推荐阅读
JavaScript 开辟中有时会碰到要将一个数组随机排序(shuffle)的需求,一个常见的写法是如许:function shuffle(arr) { arr.sort(function () { return Math.random() - 0.5; >>>详细阅读
地址:http://www.17bianji.com/lsqh/34615.html
1/2 1