https://github.com/libertyAlone/airbnb-javascript-style-guide-cn#functions--declarations
// bad
function foo() {
// ...
}
// bad
const foo = function () {
// ...
};
// good
const foo = function bar() {
// ...
};
//不理解为什么最后一个是 good,我感觉第二个应该是 good 啊
1
zzuieliyaoli 2017-08-27 20:34:33 +08:00 1
这条规则不是有解释吗?
> 别忘记命名表达式-匿名函数很难在 Error 调用栈中定位问题. |
2
qq12345454 OP @zzuieliyaoli 谢谢, 抱歉,请恕我愚钝, 还是不理解第三个和第二个有什么区别
|
3
zhlssg 2017-08-27 21:34:25 +08:00 via iPhone 1
@qq12345454 匿名和具名的区别
|
4
TabGre 2017-08-27 22:22:31 +08:00 via iPhone 1
更好的跟踪错误调用栈,不然全是匿名函数
|
5
qq12345454 OP |
7
FrankFang128 2017-08-27 23:54:54 +08:00
第一个为什么是 bad ?
第二个是 bad 我理解,第三个是 good 我也理解。 |
8
FrankFang128 2017-08-27 23:55:09 +08:00
就因为没用 const ?
|
9
ck65 2017-08-28 02:18:17 +08:00
@FrankFang128 点进链接看了一下,说是防止声明提升,增强可读性和可维护性。
|
10
geelaw 2017-08-28 03:29:38 +08:00
那还可以更极致一些……
const foo = (function () { return function foo() { /* ... */ }; })(); |
11
weakish 2017-08-28 09:21:04 +08:00
@FrankFang128 有些语言定义必须在引用之前。估计从这些语言过来的人习惯了才定这条规则。
实际上,先定义后引用和先引用后定义的可读性很难说, 就像数学书先证一堆引理,然后再证定理, 和先直接证定理,直接在证明中用引理,证明结束了再一个个证用到的引理。 这两种写法很难说哪个好。 前者符合「基础的在前,高层的在后,依赖关系明晰」的思路, 后者符合「从问题出发,将大问题转化成几个小问题,然后再解决小问题」的思路。 这两个思路都比较符合直觉。 个人更偏爱后者,从问题出发,思路比较顺畅。 看到好几个人提到数学里动机比证明重要。 先引用,后定义,能更容易看到为什么需要定义这个函数, 我觉得很多时候这个为什么比这个函数是怎样定义的更重要。 另外,IDE 跳转和浏览做的好的话,定义的先后根本就无关紧要。 IntelliJ 系的 IDE, 我常常先直接用,然后 Alt+Enter 逐个补定义。 IDE 总是给我补在上面(类什么的通常会开新文件), 不过上面下面我不在意,在哪个文件我也不在意。 因为读代码我不会从上往下读,是利用结构视图和搜索类名、函数名定位到关心的地方。 引用的东西,大部分时候只要看下名字(喜欢起较长的、描述性的名字)和类型(如果是静态类型语言), 有时可能要 ctrl+q 查下 api doc, 还搞不定那才 ctrl+b 跳转。 ctrl + b 会带我到定义那里的,所以到底在上面还是下面,还是另一个文件我并不需要关心。 回到主题,WebStorm 的 JavaScript 跳转到定义并没有遇到什么问题, 以前用 sublime 及 vscode 跳转到定义也没什么问题, 所以这条规则我觉得意义不大。 |
12
autoxbc 2017-08-28 10:45:49 +08:00
@FrankFang128 #7
请运行这段代码,感受一下函数声明违反直觉的地方 if(0) { function func() { return 2; } } console.log( func.toString() ); |
13
FrankFang128 2017-08-28 14:34:13 +08:00
@autoxbc 不允许在 if 里声明就好
|
14
autoxbc 2017-08-28 20:12:20 +08:00
@FrankFang128 #13
显然不仅仅是 if 函数声明既会提升又不遵守控制流 就是代码中的野蛮人+特权阶级 console.log( func() ); function func() { return 1; } for(var i=0;i>1;i++) { function func() { return 2; } } |