07 | `${1}`:详解JavaScript中特殊的可执行结构
该思维导图由 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-276 - 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-2636 - 潇潇雨歇看过专栏后,我是这么理解的:模版也是可执行结构,有一个发现-引用的过程,有点类似参数表,但是最后具体表现为值。自然就可以调用,而不是特意去制造这么个语法。
作者回复: 这个……这样讲,基本上也算没有什么问题。尤其是“最后具体表现为值”。 不过模板的那个叫做“模板调用”的东西,更多的揭示了它内容的更多细节。建议你看看,分析一下。就是下面这样的代码: ``` f = function() { ... }; // 声明函数 f`aabbb${x}ccc`; // 模板调用:在函数后面直接使用模板 ```
2019-11-2654 - 曙光老师 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-112 - Elmer所以我们之前所说的引用都有可能是可执行结构。 会按照场景求值,或者返回引用本身。 可以这么理解么。
作者回复: 这个倒不是。 “引用(规范类型)”还真的只是数据类型,是数据,不是可执行结构,也不包含逻辑。 “引用(规范类型)”在作为左手端和右手端的不同,是语言学层面的语义之一,是语言实现中的规范,不是一个“确定场景下的确实逻辑,或逻辑结构”。二者在讨论的并不是同一个层面的东西。
2019-12-2731 - 小胖js的函数调用的参数是传名调用,而标签模板会先计算出结果再传递给函数。 所以,模板调用是为了实现函数参数的传值调用?2019-12-022
- weineel原来对 js 的理解真是太肤浅了,特殊可执行结构 的概念刷新了我对js 的认识。2019-11-25