JavaScript 核心原理解析
周爱民
《JavaScript 语言精髓与编程实践》作者,南潮科技(Ruff)首席架构师
32699 人已学习
新⼈⾸单¥59
登录后,你可以任选3讲全文学习
课程目录
已完结/共 28 讲
开篇词 (1讲)
JavaScript 核心原理解析
15
15
1.0x
00:00/00:00
登录|注册

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

思考题
模板字面量
赋值模板
扩展风格的参数表
参数表
JavaScript中的特殊可执行结构

该思维导图由 AI 生成,仅供参考

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

模板是什么?

但是,模板就是一个字符串吗?或者我们需要更准确地问一个概念上的问题:
模板是什么?
回顾之前的内容,我们说 JavaScript 中,有语句表达式两种基本的可执行元素。这在语言设计的层面来讲,是很普通的,大多数语言都这么设计。少数的语言会省略掉语句这个语法元素,或者添加其它一些奇怪的东西,不过通常情况下它的结果就是让语言变得不那么人性。那么,是不是说,JavaScript 中只有语句和表达式是可以执行的呢?
答案是“No”,譬如这里讲到的模板,其实就是一种特殊的可执行结构
所有特殊可执行结构其实都是来自于某种固定的、确定的逻辑。这些逻辑语义是非常明确的,输入输出都很确定,这样才能被设计成一个标准的、易于理解的可执行结构。并且,如果在一门语言中添加太多的、有特殊含义的执行结构,那么这门语言就像上面说的,会显得“渐渐地有些奇怪了”。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript中的特殊可执行结构包括参数表、扩展风格的参数表和参数展开。这些结构在语言设计中起着重要作用,它们是一种特殊的可执行结构,具有明确的逻辑语义和确定的输入输出。参数表在函数调用和构造器中起着关键作用,它们通过特殊的可执行逻辑将传入的参数值与形式参数规格绑定起来,成为函数闭包中可以访问的名字。扩展风格的参数表包括缺省参数、剩余参数和参数展开,它们都是参数表作为可执行结构的逻辑中的一部分。参数展开是唯一一个能动态创建和指定参数个数的语法,它依赖于迭代器的实现。这些特殊可执行结构的理解对于深入理解JavaScript语言的内部机制和语法设计具有重要意义。 模板字面量是JavaScript中的另一个重要可执行结构,它是上述所有这些可执行结构的集大成者。模板字面量本身是一个特殊的可执行结构,调动了包括引用、求值、标识符绑定、内部可执行结构存储,以及执行函数调用在内的全部能力。模板字面量与所有其它字面量相似,它也可以作为引用。模板字面量的内部结构中,主要包括将模板多段截开的一个数组,原始的模板文本等等。在引擎处理模板时,只会将该模板解析一次,并将这些信息作为一个可执行结构缓存起来,此后将只使用该缓存的一个引用。当它作为字面量被取值时,JavaScript会在当前上下文中计算各个分段中的表达式,并将表达式的结果填回到模板从而拼接成一个结果,最后返回给用户。 总的来说,JavaScript中的可执行结构包括参数表、赋值模板和模板字面量等,它们在语言设计中扮演着重要的角色,为语言提供了丰富的语法和逻辑能力。对这些可执行结构的理解有助于深入理解JavaScript语言的内部机制和语法设计。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《JavaScript 核心原理解析》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 阡陌
    虽然不知道"模版调用"在实际中有什么用处, 但根据结果来看, 似乎只有在"模版调用"时才能访问到模版字面量这个执行结构的类参数表结构, 作为函数调用的第一个参数. 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
    6
  • 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
    3
    6
  • 潇潇雨歇
    看过专栏后,我是这么理解的:模版也是可执行结构,有一个发现-引用的过程,有点类似参数表,但是最后具体表现为值。自然就可以调用,而不是特意去制造这么个语法。

    作者回复: 这个……这样讲,基本上也算没有什么问题。尤其是“最后具体表现为值”。 不过模板的那个叫做“模板调用”的东西,更多的揭示了它内容的更多细节。建议你看看,分析一下。就是下面这样的代码: ``` f = function() { ... }; // 声明函数 f`aabbb${x}ccc`; // 模板调用:在函数后面直接使用模板 ```

    2019-11-26
    5
    4
  • 曙光
    老师 1. handler.apply = function(target, thisArgument, argArray) {...} 其中“target”是指什么。 我找到的例子,和老师这个三个参数不能一一对应上; var person = { fullName: function(city, country) { return this.firstName + " " + this.lastName + "," + city + "," + country; } } var person1 = { firstName:"John", lastName: "Doe" } person.fullName.apply(person1, ["Oslo", "Norway"]); 2. for (var {x, y} in obj) {...} 这个'in' 是否应该为'of'? in是获取对象索引 function foo({a,b}){console.log({a,b});} foo({a:1,c:2,b:3}); // { a: 1, b: 3 } function f1(){ var obj =[{a:1,b:2},{a:3,b:4}]; for(var {a,b} of obj){ console.log({a,b}); } } f1(); //{ a: 1, b: 2 } { a: 3, b: 4 } 3. “为什么 ECMAScript 要创建一个“模板调用”这样古怪的语法呢?” 1) 猜想ECMAScript 要处理部分内容发生变动的字符串。 2) 如果像C语言的print格式化字符串也行,但ECMAScript想要更抽象的处理字符串,选用函数处理 3) foo`aaa${c}bbb${x}ccc`; 对于foo的参数是[aaa,bbb,ccc],c,x,像是通用的数据格式规范,js将参数分隔,其余交给函数处理; 4. 全篇看完几遍,只记住“名字和值的绑定”,是似懂非懂。

    作者回复: 第1个问题,我在示例中讲到的是“代理对象”,所以你要看proxy相关的内容,而不是一般函数的.apply()方法。在这里:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy 第2个问题,是的,课程中写错了,应该是of。 第3个问题,其实好象就是为了扩展模板的使用而已,就好象regexp的replace支持函数参数一样。 第4个问题,^^.

    2020-11-11
    2
  • Elmer
    所以我们之前所说的引用都有可能是可执行结构。 会按照场景求值,或者返回引用本身。 可以这么理解么。

    作者回复: 这个倒不是。 “引用(规范类型)”还真的只是数据类型,是数据,不是可执行结构,也不包含逻辑。 “引用(规范类型)”在作为左手端和右手端的不同,是语言学层面的语义之一,是语言实现中的规范,不是一个“确定场景下的确实逻辑,或逻辑结构”。二者在讨论的并不是同一个层面的东西。

    2019-12-27
    3
    1
  • 小胖
    js的函数调用的参数是传名调用,而标签模板会先计算出结果再传递给函数。 所以,模板调用是为了实现函数参数的传值调用?
    2019-12-02
    2
  • weineel
    原来对 js 的理解真是太肤浅了,特殊可执行结构 的概念刷新了我对js 的认识。
    2019-11-25
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部