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

2021-06-04 15:10:26 +08:00
 jasonkayzk

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

function log_this(string, param) {
    console.log(param);
}

(function (elem) {
    log_this`${elem}`;
})('ok');

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

log_this ${elem};

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

3693 次点击
所在节点    JavaScript
22 条回复
qW7bo2FbzbC0
2021-06-04 15:12:49 +08:00
关注,我也觉得好奇
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
2021-06-04 15:17:45 +08:00
哎呦,我错了,跟原始字符串没关系。
jasonkayzk
2021-06-04 15:19:09 +08:00
ubbcou
2021-06-04 15:21:00 +08:00
这段话是解释,你的代码中 log_this 替代了默认函数
占位符中的表达式和周围的文本会一起传递给一个默认函数,该函数负责将所有的部分连接起来,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以通过该函数来对模板字符串进行操作处理。
jasonkayzk
2021-06-04 15:22:01 +08:00
@ubbcou #5 可以的,学到了,哈哈;
ubbcou
2021-06-04 15:22:28 +08:00
@jasonkayzk hh,标签函数
yxcxx
2021-06-04 15:23:24 +08:00
ruby 里函数调用就可以不带括号
```ruby
def hello name
puts "hello #{name}!"
end

hello "world"
```
jasonkayzk
2021-06-04 15:26:39 +08:00
@yxcxx #8 可能是我一般的 CRUD 写多了,不见括号,就想不到函数调用~
DOLLOR
2021-06-04 15:45:58 +08:00
可以看看这个项目,https://github.com/styled-components/styled-components,把 Tagged Templates 玩成这样。
shadeofgod
2021-06-04 15:49:58 +08:00
用 tagged template 写脚本,https://github.com/google/zx
jasonkayzk
2021-06-04 15:52:09 +08:00
@DOLLOR #10
@shadeofgod #11
都玩出花了;😄
BBCCBB
2021-06-04 16:18:00 +08:00
学习了.
overflow99
2021-06-04 16:23:25 +08:00
厉害了,学习了
lancelock
2021-06-04 16:27:17 +08:00
js 里不清楚,不过现在很多语言里都有这种写法,dsl 很依赖这个特性
JLVe
2021-06-04 16:45:46 +08:00
新语法
jasonkayzk
2021-06-04 16:52:12 +08:00
@JLVe #16 2015 年 ES6 中就有的噢!
JLVe
2021-06-04 18:29:01 +08:00
@jasonkayzk 脱离 babel 就不能投入生产环境用,所以还是新语法。
jasonkayzk
2021-06-04 19:05:10 +08:00
@JLVe #18 在控制台试一下就知道了;
shanex
2021-06-04 23:20:58 +08:00
不稀奇,貌似是 es6 新增的,jsx 之前参考过

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

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

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

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

© 2021 V2EX