首页 > 解决方案 > 如果你得到带有错误的行号,为什么建议使用命名函数进行调试?

问题描述

在 MDN 上浏览了这个例子

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 的作者还提到了哪些其他调试问题?

标签: javascript

解决方案


MDN 文档可能是在 ES2015 之前编写的,它为许多常见情况添加了函数名称推断。

但是可以使用匿名函数而无需将其与名称相关联:

setTimeout(function() {
    console.log(axe);
}, 1000);


推荐阅读