JavaScript核心原理解析
周爱民
《JavaScript语言精髓与编程实践》作者,南潮科技(Ruff)首席架构师
立即订阅
3624 人已学习
课程目录
已更新 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核心原理解析
登录|注册

10 | x = yield x:迭代过程的“函数式化”

周爱民 2019-12-04
你好,我是周爱民。欢迎回到我的专栏。
相信上一讲的迭代过程已经在许多人心中留下了巨大的阴影,所以很多人一看今天的标题,第一个反应是:“又来!”
其实我经常习惯用同一个例子,或者同类型的示例的细微不同去分辨与反映语言特性上的核心与本质的不同。如同在第 2 讲第 3 讲中都在讲的连续赋值,看起来形似,却根本上不同。
同样,我想你可能也已经注意到了,在第 5 讲(for (let x of [1,2,3]) …)和第 9 讲((…x))中所讲述的内容是有一些相关性的。它们都是在讲循环。但第 5 讲主要讨论的是语句对循环的抽象和如何在循环中处理块。而第 9 讲则侧重于如何通过函数执行把(类似第 5 讲的)语句执行重新来实现一遍。事实上,仅仅是一个“循环过程”,在 JavaScript 中就实现了好几次。这些我将来都会具体地来为你分析。
至于今天,我还是回到函数的三个语义组件,也就是“参数、执行体和结果”来讨论。上一讲本质上讨论的是对“执行体”这个组件的重造,今天,则讨论对“参数和结果”的重构。

将迭代过程展开

通过上一讲,你应该知道迭代器是可以表达为一组函数的连续执行的。那么,如果我们要把这一组函数展开来看的话,其实它们之间的相似性是极强的。例如:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《JavaScript核心原理解析》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • 许童童
    如果遇到 yield* 就将当前的yield执行权交到 yield* 里面,yield* 里面return的值,将返回给外层的x = yield* xxx 中的x

    作者回复: Yes. 赞的!+2

    2019-12-04
    1
  • .Alter
    老师好,我想问一下生成器这个挂起和调用栈移动的机制是协程吗?

    作者回复: 不是。

    不过实现上,可以是。OS真实线程的切换成本高,在实现上用协程来做是可以的。但这与具体引擎的选择有关。另外按照ECMAScript的约定,这里自己实现一个上下文的管理器也是可以的,与线程什么的,并没有关系。

    2019-12-09
    1
  • 阿鑫
    我的理解就是 tor 这个句柄其实就是包含了这个迭代器的一切,包括上下文 context 和执行函数。每次执行 tor.next() 就是把 context 压入栈顶,然后执行执行函数?

    作者回复: 确实,ECMAScript就是这样做的。

    如果tor是一个生成器对象,那么它就会有[[GeneratorContext]]这个私有槽,而tor.next()方法就是从这个私有槽中取出上下文给塞回到栈上。

    2019-12-04
  • 行问
    x = yield x

    首先,yield 是向函数外发送 x 的值

    其次,yield 接收外部传入的参数并赋值给 x

    解惑了之前理解 yield 是一个“等待”的过程,没有往“挂起”去构思

    时不时会用到 async await 来写并行的 Promise, 但 yield 只知其知识点和应用,还没有开发中实际使用过

    作者回复: Promise比await要难用一点,但其实深刻理解promise对整个的语言学习提升很大很大,因为它提供了一种新的理解程序执行逻辑的模式。不过这些内容,会放到20讲之后才讨论,这一次的课程中是不包括的。:)

    2019-12-04
    1
  • 潇潇雨歇
    先看看yield再来
    2019-12-04
收起评论
5
返回
顶部