V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
jasonkayzk
V2EX  ›  JavaScript

在 Javascript 中不用括号也能调用函数?

  •  1
     
  •   jasonkayzk · 2021-06-04 15:10:26 +08:00 · 3912 次点击
    这是一个创建于 1271 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天看代码突然发现了类似于下面的一段 js 代码,是可以正常输出的:

    function log_this(string, param) {
        console.log(param);
    }
    
    (function (elem) {
        log_this`${elem}`;
    })('ok');
    

    我想问的是,代码里面的这个:

    log_this ${elem};

    为什么可以正常调用(新的 ES 语法?);原谅我的孤陋寡闻~

    22 条回复    2021-06-06 10:16:02 +08:00
    qW7bo2FbzbC0
        1
    qW7bo2FbzbC0  
       2021-06-04 15:12:49 +08:00
    关注,我也觉得好奇
    ubbcou
        2
    ubbcou  
       2021-06-04 15:14:30 +08:00
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Template_literals#%E5%8E%9F%E5%A7%8B%E5%AD%97%E7%AC%A6%E4%B8%B2

    原始字符串
    在标签函数的第一个参数中,存在一个特殊的属性 raw,我们可以通过它来访问模板字符串的原始字符串,而不经过特殊字符的替换。

    ```
    function tag(strings) {
    console.log(strings.raw[0]);
    }

    tag`string text line 1 \n string text line 2`;
    // logs "string text line 1 \n string text line 2" ,
    // including the two characters '\' and 'n'
    ```
    ubbcou
        3
    ubbcou  
       2021-06-04 15:17:45 +08:00
    哎呦,我错了,跟原始字符串没关系。
    jasonkayzk
        4
    jasonkayzk  
    OP
       2021-06-04 15:19:09 +08:00
    ubbcou
        5
    ubbcou  
       2021-06-04 15:21:00 +08:00
    这段话是解释,你的代码中 log_this 替代了默认函数
    占位符中的表达式和周围的文本会一起传递给一个默认函数,该函数负责将所有的部分连接起来,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以通过该函数来对模板字符串进行操作处理。
    jasonkayzk
        6
    jasonkayzk  
    OP
       2021-06-04 15:22:01 +08:00
    @ubbcou #5 可以的,学到了,哈哈;
    ubbcou
        7
    ubbcou  
       2021-06-04 15:22:28 +08:00
    @jasonkayzk hh,标签函数
    yxcxx
        8
    yxcxx  
       2021-06-04 15:23:24 +08:00
    ruby 里函数调用就可以不带括号
    ```ruby
    def hello name
    puts "hello #{name}!"
    end

    hello "world"
    ```
    jasonkayzk
        9
    jasonkayzk  
    OP
       2021-06-04 15:26:39 +08:00
    @yxcxx #8 可能是我一般的 CRUD 写多了,不见括号,就想不到函数调用~
    DOLLOR
        10
    DOLLOR  
       2021-06-04 15:45:58 +08:00   ❤️ 2
    可以看看这个项目,https://github.com/styled-components/styled-components,把 Tagged Templates 玩成这样。
    shadeofgod
        11
    shadeofgod  
       2021-06-04 15:49:58 +08:00
    用 tagged template 写脚本,https://github.com/google/zx
    jasonkayzk
        12
    jasonkayzk  
    OP
       2021-06-04 15:52:09 +08:00
    @DOLLOR #10
    @shadeofgod #11
    都玩出花了;😄
    BBCCBB
        13
    BBCCBB  
       2021-06-04 16:18:00 +08:00
    学习了.
    overflow99
        14
    overflow99  
       2021-06-04 16:23:25 +08:00
    厉害了,学习了
    lancelock
        15
    lancelock  
       2021-06-04 16:27:17 +08:00
    js 里不清楚,不过现在很多语言里都有这种写法,dsl 很依赖这个特性
    JLVe
        16
    JLVe  
       2021-06-04 16:45:46 +08:00
    新语法
    jasonkayzk
        17
    jasonkayzk  
    OP
       2021-06-04 16:52:12 +08:00
    @JLVe #16 2015 年 ES6 中就有的噢!
    JLVe
        18
    JLVe  
       2021-06-04 18:29:01 +08:00
    @jasonkayzk 脱离 babel 就不能投入生产环境用,所以还是新语法。
    jasonkayzk
        19
    jasonkayzk  
    OP
       2021-06-04 19:05:10 +08:00
    @JLVe #18 在控制台试一下就知道了;
    shanex
        20
    shanex  
       2021-06-04 23:20:58 +08:00
    不稀奇,貌似是 es6 新增的,jsx 之前参考过
    darknoll
        22
    darknoll  
       2021-06-06 10:16:02 +08:00
    alert`test`
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5399 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:47 · PVG 13:47 · LAX 21:47 · JFK 00:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.