javascript - 如果你得到带有错误的行号,为什么建议使用命名函数进行调试?
问题描述
const foo = function() {
console.log("foobar");
}
// Invoke it using the variable
foo();
并看到了这个建议:
即使您的函数已命名,您也可以使用变量名来调用它。在调试代码时命名它会很有帮助。但它不会影响我们调用它的方式。
所以我运行它,node
但将其修改为:
// anonymous function
const foo = function() {
console.log("foo");
console.log(axe); //added line to create error
}
foo(); // invoke function with parentheses
并得到错误:
/Users/user/Documents/Practice/JavaScript/MDN/first_class_function.js:8
console.log(axe);
^
ReferenceError: axe is not defined
at foo (/Users/user/Documents/Practice/JavaScript/MDN/first_class_function.js:8:17)
at Object.<anonymous> (/Users/user/Documents/Practice/JavaScript/MDN/first_class_function.js:10:1)
at Module._compile (internal/modules/cjs/loader.js:1147:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)
at Module.load (internal/modules/cjs/loader.js:996:32)
at Function.Module._load (internal/modules/cjs/loader.js:896:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47
现在有一个命名函数logBar()
:
const bar = function logBar() {
console.log("bar");
console.log(axe);
}
bar();
我没有得到任何额外的信息:
/Users/user/Documents/Practice/JavaScript/MDN/first_class_function.js:14
console.log(axe);
^
ReferenceError: axe is not defined
at logBar (/Users/user/Documents/Practice/JavaScript/MDN/first_class_function.js:14:17)
at Object.<anonymous> (/Users/user/Documents/Practice/JavaScript/MDN/first_class_function.js:16:1)
at Module._compile (internal/modules/cjs/loader.js:1147:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)
at Module.load (internal/modules/cjs/loader.js:996:32)
at Function.Module._load (internal/modules/cjs/loader.js:896:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47
由于节点告诉我问题出现在哪一行,这是否消除了使用命名函数进行调试的原因?除非通过调试,否则它们的意思是在没有所有上下文的情况下找出函数的用途,如果存在复杂的业务逻辑,则通过代码解析。MDN 的作者还提到了哪些其他调试问题?
解决方案
MDN 文档可能是在 ES2015 之前编写的,它为许多常见情况添加了函数名称推断。
但是可以使用匿名函数而无需将其与名称相关联:
setTimeout(function() {
console.log(axe);
}, 1000);
推荐阅读
- heroku - Strapi + Heroku 部署失败:npm ERR!代码 ERESOLVE
- sql - 获取第二个最大日期json对象(postgres)
- python - 如何解决错误“发生错误:Django/Python3 应用程序没有此类文件或目录”
- c++ - 为什么我需要使用队列
q 并且不能使用队列 问? - javascript - 将文件上传到 Firebase 存储时遇到问题
- php - 我有一个未序列化的数据。现在我如何剪切数组的第一部分并将其转换为 json 格式?
- python - 如何按列表中的出现频率对 Django 查询集进行排序并确保其余对象跟随?
- java - Netbeans 和 SQL 连接无法加载身份验证插件“caching_sha2_password”
- python - 为什么 tf.cond 中的两个分支都被执行?为什么即使条件仍然成立,tf.while_loop 也会完成循环?
- reactjs - 使用 useTheme 钩子时,Material UI 不使用覆盖样式