关于 Airbnb JavaScript 编码规范中有个地方不解

2017-08-27 19:53:17 +08:00
 qq12345454

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 啊
1687 次点击
所在节点    问与答
14 条回复
zzuieliyaoli
2017-08-27 20:34:33 +08:00
这条规则不是有解释吗?

> 别忘记命名表达式-匿名函数很难在 Error 调用栈中定位问题.
qq12345454
2017-08-27 20:40:03 +08:00
@zzuieliyaoli 谢谢, 抱歉,请恕我愚钝, 还是不理解第三个和第二个有什么区别
zhlssg
2017-08-27 21:34:25 +08:00
@qq12345454 匿名和具名的区别
TabGre
2017-08-27 22:22:31 +08:00
更好的跟踪错误调用栈,不然全是匿名函数
qq12345454
2017-08-27 22:48:28 +08:00
@zzuieliyaoli
@zhlssg
@TabGre

明白了, 谢谢三位
kenshinhu
2017-08-27 23:26:08 +08:00
@TabGre 有点不解?为什么匿名函数会更好的跟踪错误调用栈??
FrankFang128
2017-08-27 23:54:54 +08:00
第一个为什么是 bad ?
第二个是 bad 我理解,第三个是 good 我也理解。
FrankFang128
2017-08-27 23:55:09 +08:00
就因为没用 const ?
ck65
2017-08-28 02:18:17 +08:00
@FrankFang128 点进链接看了一下,说是防止声明提升,增强可读性和可维护性。
geelaw
2017-08-28 03:29:38 +08:00
那还可以更极致一些……

const foo = (function () {
return function foo() {
/* ... */
}; })();
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 跳转到定义也没什么问题,
所以这条规则我觉得意义不大。
autoxbc
2017-08-28 10:45:49 +08:00
@FrankFang128 #7

请运行这段代码,感受一下函数声明违反直觉的地方

if(0)
{
function func()
{
return 2;
}
}
console.log( func.toString() );
FrankFang128
2017-08-28 14:34:13 +08:00
@autoxbc 不允许在 if 里声明就好
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;
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/386177

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX