JavaScript核心原理解析
周爱民
《JavaScript语言精髓与编程实践》作者,南潮科技(Ruff)首席架构师
立即订阅
3637 人已学习
课程目录
已更新 21 讲 / 共 21 讲
0/3登录后,你可以任选3讲全文学习。
开篇词 (1讲)
开篇词 | 如何解决语言问题?
免费
从零开始:JavaScript语言是如何构建起来的 (5讲)
01 | delete 0:JavaScript中到底有什么是可以销毁的
02 | var x = y = 100:声明语句与语法改变了JavaScript语言核心性质
03 | a.x = a = {n:2}:一道被无数人无数次地解释过的经典面试题
04 | export default function() {}:你无法导出一个匿名函数表达式
05 | for (let x of [1,2,3]) ...:for循环并不比使用函数递归节省开销
从表达式到执行引擎:JavaScript是如何运行的 (6讲)
06 | x: break x; 搞懂如何在循环外使用break,方知语句执行真解
07 | `${1}`:详解JavaScript中特殊的可执行结构
08 | x => x:函数式语言的核心抽象:函数与表达式的同一性
09 | (...x):不是表达式、语句、函数,但它却能执行
10 | x = yield x:迭代过程的“函数式化”
11 | throw 1;:它在“最简单语法榜”上排名第三
从原型到类:JavaScript是如何一步步走向应用编程语言的 (6讲)
12 | 1 in 1..constructor:这行代码的结果值,既可能是true,也可能是false
13 | new X:从构造器到类,为你揭密对象构造的全程
14 | super.xxx():虽然直到ES10还是个半吊子实现,却也值得一讲
15 | return Object.create(new.target.prototype):做框架设计的基本功:写一个根类
16 | [a, b] = {a, b}:让你从一行代码看到对象的本质
17 | Object.setPrototypeOf(x, null):连Brendan Eich都认错,但null值还活着
不定期加餐 (3讲)
加餐 | 捡豆吃豆的学问(上):这门课讲的是什么?
免费
加餐 | 捡豆吃豆的学问(下):这门课该怎么学?
免费
加餐 | 让JavaScript运行起来
免费
JavaScript核心原理解析
登录|注册

07 | `${1}`:详解JavaScript中特殊的可执行结构

周爱民 2019-11-25
你好,我是周爱民。
今天这一讲的标题是一个模板。模板这个语法元素在 JavaScript 中出现得很晚,以至于总是有人感到奇怪:为什么 JavaScript 这么晚才弄出个模板这样的东西?
模板看起来很简单,就是把一个字符串里的东西替换一下就行了,C 语言里的 printf() 就有类似的功能,Bash 脚本里也可以直接在字符串里替换变量。这个功能非常好用,但在实现上其实很简单,无非就是字符串替换而已。

模板是什么?

但是,模板就是一个字符串吗?或者我们需要更准确地问一个概念上的问题:
模板是什么?
回顾之前的内容,我们说 JavaScript 中,有语句表达式两种基本的可执行元素。这在语言设计的层面来讲,是很普通的,大多数语言都这么设计。少数的语言会省略掉语句这个语法元素,或者添加其它一些奇怪的东西,不过通常情况下它的结果就是让语言变得不那么人性。那么,是不是说,JavaScript 中只有语句和表达式是可以执行的呢?
答案是“No”,譬如这里讲到的模板,其实就是一种特殊的可执行结构
所有特殊可执行结构其实都是来自于某种固定的、确定的逻辑。这些逻辑语义是非常明确的,输入输出都很确定,这样才能被设计成一个标准的、易于理解的可执行结构。并且,如果在一门语言中添加太多的、有特殊含义的执行结构,那么这门语言就像上面说的,会显得“渐渐地有些奇怪了”。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《JavaScript核心原理解析》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • 阡陌
    虽然不知道"模版调用"在实际中有什么用处, 但根据结果来看, 似乎只有在"模版调用"时才能访问到模版字面量这个执行结构的类参数表结构, 作为函数调用的第一个参数.
    var c = 'ccc', x = 1;
    bar = (a1, a2, ...otherArgs) => console.log(a1, '-------', a2, '-----', otherArgs);
    bar`ass${c}edd${x}illll`;
    // ["ass", "edd", "illll", raw: Array(3)] "-------" "ccc" "-----" [1]

    作者回复: 是的。的确如此。而且除了“定制替换规则”之外,我也想不到有什么用处。

    这很类似于在string.replace()里面,你可以写成string.repalce('a', 'b')这样的一次替换,也可以写成string.replace(/a/g, function f() {})这样子,通过f()来定制替换的规则。

    js只是提供了这种便捷性给你,并且约定了在函数f()上的参数界面而已。

    2019-11-27
    2
  • 潇潇雨歇
    看过专栏后,我是这么理解的:模版也是可执行结构,有一个发现-引用的过程,有点类似参数表,但是最后具体表现为值。自然就可以调用,而不是特意去制造这么个语法。

    作者回复: 这个……这样讲,基本上也算没有什么问题。尤其是“最后具体表现为值”。

    不过模板的那个叫做“模板调用”的东西,更多的揭示了它内容的更多细节。建议你看看,分析一下。就是下面这样的代码:

    ```
    f = function() { ... }; // 声明函数
    f`aabbb${x}ccc`; // 模板调用:在函数后面直接使用模板
    ```

    2019-11-26
    4
    2
  • Astrogladiator-埃蒂纳度斯
    所以“1=1”是一个运行期错(ReferenceError),而不是语法错误(SyntaxError)。
    请问为什么我尝试运行1=1在chrome控制台和node环境都报的语法错?
    Uncaught SyntaxError: Invalid left-hand side in assignment

    作者回复: 这个很有可能是宿主程序的处理。我在Chrome控制台里也这么报错。不过在node.js里面却是ReferenceError。

    我用node v8.14和node v11.13都测试过。

    2019-11-26
    2
  • 舒佳锦
    js的函数调用的参数是传名调用,而标签模板会先计算出结果再传递给函数。
    所以,模板调用是为了实现函数参数的传值调用?
    2019-12-02
    2
  • sprinty
    原来对 js 的理解真是太肤浅了,特殊可执行结构 的概念刷新了我对js 的认识。
    2019-11-25
收起评论
5
返回
顶部