V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
liujianwei
V2EX  ›  程序员

这个 JS 错是为什么?

  •  
  •   liujianwei ·
    jianliuwei · 2019-04-01 14:27:13 +08:00 · 2480 次点击
    这是一个创建于 1823 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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

    13 条回复    2019-04-01 20:29:22 +08:00
    ccccccc
        1
    ccccccc  
       2019-04-01 14:33:36 +08:00
    注意分号
    yuanfnadi
        2
    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();


    请格式化代码。
    no1xsyzy
        4
    no1xsyzy  
       2019-04-01 14:37:32 +08:00
    @ccccccc 可以,眼尖
    azh7138m
        5
    azh7138m  
       2019-04-01 14:43:55 +08:00
    @no1xsyzy 这不是眼尖吧,这是个 ASI 的问题了........
    liujianwei
        6
    liujianwei  
    OP
       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
        7
    crazyrock  
       2019-04-01 14:50:58 +08:00
    @liujianwei 你这分号加开头是啥意思?
    liujianwei
        8
    liujianwei  
    OP
       2019-04-01 14:53:27 +08:00
    @crazyrock 就相当于加在了上一行的行位,对于解释器来说是一样的,但这样更易于,对不加分号的少数几个例外情况的规则的描述。人读着不好看的话,可以格式化一下即可。
    no1xsyzy
        9
    no1xsyzy  
       2019-04-01 15:09:24 +08:00
    @azh7138m 常见问题吗?我就是不写分号也难得碰到。
    让我好好想想我是怎么个写法……
    no1xsyzy
        10
    no1xsyzy  
       2019-04-01 15:12:51 +08:00
    @crazyrock JavaScript Standard Style, available at: <https://standardjs.com/rules.html#semicolons>
    HustLiu
        11
    HustLiu  
       2019-04-01 17:36:26 +08:00
    这就是为什么立即执行函数括号前一般会加个分号的标准例子……
    ochatokori
        12
    ochatokori  
       2019-04-01 17:49:26 +08:00 via Android
    最必要加分号的地方你不加分号,还以为你是来考大家的。。。
    crazyrock
        13
    crazyrock  
       2019-04-01 20:29:22 +08:00
    @no1xsyzy 多谢,一直都不知道呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3930 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:27 · PVG 18:27 · LAX 03:27 · JFK 06:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.