这个 JS 错是为什么?

2019-04-01 14:27:13 +08:00
 liujianwei
var f = function() { console.log('I am outside!'); }

(function s() {
    var f = function() { console.log('I am inside!'); }
    f();
}());

f();

"C:\Program Files\JetBrains\IntelliJ IDEA 2018.1.4\bin\runnerw.exe" C:\nodejs\node.exe C:\path\to\projects\test\src\test\test.js I am inside! C:\path\to\projects\test\src\test\test.js:8 f(); I am outside! ^

TypeError: f is not a function at Object.<anonymous> (C:\path\to\projects\test\src\test\test.js:8:1) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32) at tryModuleLoad (internal/modules/cjs/loader.js:538:12) at Function.Module._load (internal/modules/cjs/loader.js:530:3) at Function.Module.runMain (internal/modules/cjs/loader.js:742:12) at startup (internal/bootstrap/node.js:283:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)</anonymous>

Process finished with exit code 1

2520 次点击
所在节点    程序员
13 条回复
ccccccc
2019-04-01 14:33:36 +08:00
注意分号
yuanfnadi
2019-04-01 14:35:35 +08:00
let f = function() {
console.log('I am outside!');
};
(function s() {
let f = function() {
console.log('I am inside!');
};
f();
})();

f();


请格式化代码。
azh7138m
2019-04-01 14:37:23 +08:00
no1xsyzy
2019-04-01 14:37:32 +08:00
@ccccccc 可以,眼尖
azh7138m
2019-04-01 14:43:55 +08:00
@no1xsyzy 这不是眼尖吧,这是个 ASI 的问题了........
liujianwei
2019-04-01 14:48:54 +08:00
明白了!

```
var f = function() { console.log('I am outside!') }

;(function s() {
var f = function() { console.log('I am inside!') }
f()
}())

f()
```

对于不喜欢加分号的我,只要对行首字符进行判断,如果是 `[ ( + - / `五个符号之一,就在行首加分号。
crazyrock
2019-04-01 14:50:58 +08:00
@liujianwei 你这分号加开头是啥意思?
liujianwei
2019-04-01 14:53:27 +08:00
@crazyrock 就相当于加在了上一行的行位,对于解释器来说是一样的,但这样更易于,对不加分号的少数几个例外情况的规则的描述。人读着不好看的话,可以格式化一下即可。
no1xsyzy
2019-04-01 15:09:24 +08:00
@azh7138m 常见问题吗?我就是不写分号也难得碰到。
让我好好想想我是怎么个写法……
no1xsyzy
2019-04-01 15:12:51 +08:00
@crazyrock JavaScript Standard Style, available at: <https://standardjs.com/rules.html#semicolons>
HustLiu
2019-04-01 17:36:26 +08:00
这就是为什么立即执行函数括号前一般会加个分号的标准例子……
ochatokori
2019-04-01 17:49:26 +08:00
最必要加分号的地方你不加分号,还以为你是来考大家的。。。
crazyrock
2019-04-01 20:29:22 +08:00
@no1xsyzy 多谢,一直都不知道呢

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

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

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

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

© 2021 V2EX