代码写了那么多,你搞明白yield是个啥没?

广告位招租
扫码页面底部二维码联系

ES6真是颠覆JavaScript的东西【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】,随便翻一个新特性出来,就让自以为是的老原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】古董们傻眼跳楼。在之前接触ember.j【未经授权禁止转载】【作者:唐霜】s的时候,接触到了yield,嫩是半天没本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net明白,yield到底是什么,想要实现什么【未经授权禁止转载】【原创不易,请尊重版权】目的。后来在看ES6的东西的时候,总算好【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。像知道了一点,迫不及待的写出来。

著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net

在MDN上,对yield的第一句解释就是转载请注明出处:www.tangshuang.net原创内容,盗版必究。

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【转载请注明来源】

The 原创内容,盗版必究。yield keyword is used to 【转载请注明来源】未经授权,禁止复制转载。pause and resume a g【原创内容,转载请注明出处】【原创不易,请尊重版权】enerator function.
【转载请注明来源】【关注微信公众号:wwwtangshuangnet】 // yield这个关键字是用来暂停和本文版权归作者所有,未经授权不得转载。【作者:唐霜】恢复一个遍历器函数(的运行)的。

【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。
原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】

这也就是yield的所有解释了,可谓大道本文版权归作者所有,未经授权不得转载。【转载请注明来源】至简,然并卵,深层的意思不去挖掘,根本还原创内容,盗版必究。【作者:唐霜】是没法用它,还是老老实实做老古董。

【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【转载请注明来源】

关键字yield【原创内容,转载请注明出处】

【原创不易,请尊重版权】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】

没错,yield是个关键字,不是函数。关【作者:唐霜】【本文受版权保护】键字用来干啥?它的作用是“命令”。和va【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。r不同,不是用来声明,但是和return本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】一样,用来告知程序某种状态,return未经授权,禁止复制转载。未经授权,禁止复制转载。告诉程序要返回什么值(也意味着结束,结束【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。的时候才会返回值嘛),而yield告诉程未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】序当前的状态值,而且你运行到这里给我暂停【未经授权禁止转载】【原创不易,请尊重版权】一下。

【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【作者:唐霜】【原创不易,请尊重版权】

因为yield是命令型的关键字,所以它的【作者:唐霜】本文版权归作者所有,未经授权不得转载。用法是:

原创内容,盗版必究。【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net
[rv] = yield [expression];

rv是可选的,这里不是说它返回一个数组。【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】yield后面的表达式也是可选的。yie【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netld的返回值是一个状态值。如果从返回值的本文版权归作者所有,未经授权不得转载。【本文受版权保护】角度讲,yield还可以当做是一种运算符转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】,但是由于它的作用是暂停和恢复,所以严格【转载请注明来源】【作者:唐霜】意义上说,不能叫运算符,运算符是用来运算【本文受版权保护】【原创不易,请尊重版权】的,而yield是用来“命令”的。

【原创内容,转载请注明出处】【作者:唐霜】【未经授权禁止转载】转载请注明出处:www.tangshuang.net

遍历器函数(Generator)本文版权归作者所有,未经授权不得转载。

著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

这是ES6里面新增的Generator,转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】为了把它和我们已知的东西联系起来,我把它原创内容,盗版必究。原创内容,盗版必究。翻译为迭代器函数,但是实际上现在还没有统【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。一的叫法,坐等大神们开宗立派。

【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net

我个人的理解,Generator函数的最【未经授权禁止转载】本文作者:唐霜,转载请注明出处。大用处就是用来生成一个迭代器,所以叫做“未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net迭代器生成器”。

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。

不过它是一个函数,所以和普通的函数有点区【转载请注明来源】【本文首发于唐霜的博客】别,因此在声明函数的时候,要在funct本文作者:唐霜,转载请注明出处。【本文受版权保护】ion和函数名之间加一个*号:

转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】
function * foo() {}

而yield也必须在Generator函本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net数中才有意义,脱离了Generator函本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】数就没意义了。

【版权所有,侵权必究】原创内容,盗版必究。【本文首发于唐霜的博客】未经授权,禁止复制转载。【作者:唐霜】

Generator函数的一个重要特点就是著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】需要执行next()方法才能运行,声明好本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】它之后,根本不会马上运行。举个栗子:

本文作者:唐霜,转载请注明出处。【作者:唐霜】【转载请注明来源】
var a = 0;
function * foo() {
  a += 1
  yield
  return
}
var i = foo()
alert(a) // 这个时候是啥值?

上面的例子如此简单,你不会看不懂吧?现在原创内容,盗版必究。【未经授权禁止转载】告诉你,alert的结果是0!

【未经授权禁止转载】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net

我前面都说了,要执行netx()方法才会【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net运行。所以在上面的代码末尾添加:

【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net
i.next()
alert(a) // 这个时候就会alert(1)了

没怎明白?继续往下读【版权所有,侵权必究】

著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【原创不易,请尊重版权】

.next()方法【转载请注明来源】

【作者:唐霜】【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。原创内容,盗版必究。

就用上面的代码来说好了。Generato原创内容,盗版必究。【本文首发于唐霜的博客】r函数生成的是一个迭代器,所谓迭代器,你原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。不让它动,它绝对不会动。

转载请注明出处:www.tangshuang.net【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net

不要用“动”这么猥琐的词好吗?原创内容,盗版必究。

【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。

“执行、运行”,i作为一个迭代器,最基本【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。的的特征是它拥有一个next方法和一个当未经授权,禁止复制转载。【原创内容,转载请注明出处】前的状态。当调用i.next()的时候,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】程序从generator函数开始运行,当著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。遇到yield命令时,就“暂停”刮起,并【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。且返回yield [expression]本文版权归作者所有,未经授权不得转载。expression的运算结果,这个结果【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】就是前文所讲的“状态”【版权所有,侵权必究】

原创内容,盗版必究。未经授权,禁止复制转载。【转载请注明来源】

比如程序在往下运行的时候,遇到原创内容,盗版必究。yield 1 + 2,那么i.next()返回的结果就是这个【作者:唐霜】本文版权归作者所有,未经授权不得转载。时候的状态,是一个对象,其运算结果“3”【未经授权禁止转载】原创内容,盗版必究。被放在value中。

转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】

i.next()就是让它往下一个元素遍历转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net的动作,它的返回值其实表示一个状态,是一【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。个object:{value: xxx,本文作者:唐霜,转载请注明出处。【未经授权禁止转载】 done: false}。value表本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net示yield后面的表达式的结果值,don原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。e表示是否已经遍历完。把上面的i.nex著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。t()那段代码改成下面的:

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net
var s1 = i.next()
console.log(s1) // { value: '', done: false }
var s2 = i.next()
console.log(s2) // { value: undefined, done: true }

第一个console的地方,因为第一次执著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。行i.next(),遇到yield就暂停著作权归作者所有,禁止商业用途转载。【转载请注明来源】了,并讲yield后面的表达式作为值放到著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】状态的value属性上。得到s1这个状态转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。,这个状态的value是yield后面紧本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。跟的表达式的值,done表示遍历没有结束著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】,还可以继续执行next()方法。第二次未经授权,禁止复制转载。原创内容,盗版必究。再执行i.next()的时候,遇到了re【作者:唐霜】转载请注明出处:www.tangshuang.netturn,但后面没有表达式,所以返回值是【作者:唐霜】【关注微信公众号:wwwtangshuangnet】undefined,一旦遇到return转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。就表示遍历可以结束了,所以done为tr未经授权,禁止复制转载。转载请注明出处:www.tangshuang.netue。

【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】

当运行到未经授权,禁止复制转载。yield '';的时候,程序暂停了,不会往下继续执行,所转载请注明出处:www.tangshuang.net原创内容,盗版必究。以下面的各种加减乘除都不会运行,这也就是【本文首发于唐霜的博客】【未经授权禁止转载】为什么我们上面的代码在运行i.next(【作者:唐霜】【转载请注明来源】)之前,虽然执行了foo()这个函数,但未经授权,禁止复制转载。未经授权,禁止复制转载。是a的值是0,就是因为还没有执行i.ne【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】xt(),所以yield前面的a += 1还没有运行。【访问 www.tangshuang.net 获取更多精彩内容】

【原创内容,转载请注明出处】【作者:唐霜】未经授权,禁止复制转载。未经授权,禁止复制转载。【原创不易,请尊重版权】

也正是因为有.next()方法,所以它叫未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net迭代器。for…of,著作权归作者所有,禁止商业用途转载。【本文受版权保护】230;,Array.from都是利用迭【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net代器接口进行运算的,所以如果没有Gene原创内容,盗版必究。原创内容,盗版必究。rator,这几个方法就用不了。而在Ba【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。bel里面,babel-core本身不支【作者:唐霜】【原创不易,请尊重版权】持Generator,所以这几个运算其实【版权所有】唐霜 www.tangshuang.net【转载请注明来源】也需要另外的模块(regenerator本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。)来支持。

【作者:唐霜】【作者:唐霜】原创内容,盗版必究。未经授权,禁止复制转载。

一不小心讲到了babel,罪过罪过。【访问 www.tangshuang.net 获取更多精彩内容】

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

.next()的参数原创内容,盗版必究。

转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】

造孽的地方终于要来了。一言不合,就上代码【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。

转载请注明出处:www.tangshuang.net【转载请注明来源】本文版权归作者所有,未经授权不得转载。
const gen = function * () { // 没错,尼玛还可以这样写
  const x = 1
  const y = yield (x + 1)
  const z = yield (x + y)
  return z
}
const foo = gen() // 你必须先执行一下Generator函数,才能把遍历器返回给某个变量
const a = foo.next() // 第一次执行next()不可以传参,就算传参也没有效果
const b = foo.next(3) // 后续的next都可以传参
const c = foo.next(4)

求abc的value各是多少?【版权所有】唐霜 www.tangshuang.net

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。

你要没接触过,这个时候只会冒出来“吊雷老【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net某”……a.value你应该知道,就2(转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。x = 1, x + 1 = 2)。b.【本文首发于唐霜的博客】原创内容,盗版必究。value呢?傻戳戳了吧。

本文版权归作者所有,未经授权不得转载。【本文受版权保护】本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】

.next()的参数的意思是将传入的参数【转载请注明来源】转载请注明出处:www.tangshuang.net用作上一次的yield。啥子意思?就是第【版权所有,侵权必究】未经授权,禁止复制转载。二次执行foo.next(3)的时候,yield (x + 1)这一大坨就是3,所以y = 3!“xx老【原创内容,转载请注明出处】【本文首发于唐霜的博客】谋”。所以,b.value的结果就是4 【未经授权禁止转载】【原创内容,转载请注明出处】(x = 1,y = 3, x + y 【本文受版权保护】【本文受版权保护】= 4).

原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。

这样推下去咯。最后返回的是z,但是传入的【未经授权禁止转载】本文作者:唐霜,转载请注明出处。是4,yield (x + y) 这一大坨就用4来代替,z.value 【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net= yield (x + y) = 4。

【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】

为什么第一次执行next()不能传参?原创内容,盗版必究。

【转载请注明来源】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。原创内容,盗版必究。

因为第一次执行next()的时候,你传入转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。的参数没法去代替某一个yield啊!

【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】

正确使用括号:【关注微信公众号:wwwtangshuangnet】

【作者:唐霜】【转载请注明来源】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net
function * gen() {
  const x = 1
  const y = (yield x + 1) + 2
  return y
}

这里我们规定【访问 www.tangshuang.net 获取更多精彩内容】y = (yield x + 1) + 2,意味着当next(5)的时候,【作者:唐霜】(yield x + 1)会被整个替换掉,y = 5 + 2 = 【版权所有】唐霜 www.tangshuang.net【转载请注明来源】7。

【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。

总结一下,想知道迭代器当前的状态值,也就本文作者:唐霜,转载请注明出处。原创内容,盗版必究。是.next()的返回值,只需要看yie著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。ld后面的表达式的结果。但是由于大部分情【版权所有,侵权必究】【原创内容,转载请注明出处】况下,yield后面的表达式由前面的运算【本文受版权保护】【版权所有】唐霜 www.tangshuang.net结果参与,所以,处于后面的yield的值转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】,要看前面的yield接收到的next(【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】)的参数,带入赋值并运算之后才能知道状态【作者:唐霜】未经授权,禁止复制转载。的值。

本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】

把yield当变量看【访问 www.tangshuang.net 获取更多精彩内容】

著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。

上面这一个小节你有没有发现一个神奇的规律著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】?就是你在给next()传参的时候,总是转载请注明出处:www.tangshuang.net原创内容,盗版必究。对应某一个yield,把这个yield以【本文受版权保护】原创内容,盗版必究。及后面紧跟着的表达式用传入的参数代替。于本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net是乎,下面这个代码你就懂了:

【未经授权禁止转载】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。
var foo = function *() {
  var x = 1;
  var y = yield (x + 1);
  var z = yield;
  return z;
}()
var a = foo.next();
var b = foo.next(3);
var c = foo.next(4);

上面这个代码里面,竟然把yield后面的【原创不易,请尊重版权】【原创内容,转载请注明出处】表达式给去掉了。那会有啥影响?b.val【本文首发于唐霜的博客】原创内容,盗版必究。ue将等于undefined,仅此而已。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】因为b这个位置就是得到yield [空]的结果,所以就是undefined咯。但著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】是当foo.next(4)执行的时候,不【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。管你上面是不是undefined,我现在【版权所有,侵权必究】【本文首发于唐霜的博客】就是要用4来覆盖你,所以c.value还【转载请注明来源】本文版权归作者所有,未经授权不得转载。是4.

【版权所有,侵权必究】【版权所有,侵权必究】【本文首发于唐霜的博客】【版权所有,侵权必究】

也正因为这样,在字符串里面,可以这样使用【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。
var log = function *() {
  console.log(`you input: ${yeild}`)
}().next(); // 这里会提示错误: yeild undefined
log.next('hello world!');

上面这个例子把yield当做一个变量来使【版权所有,侵权必究】【版权所有,侵权必究】用,如果你感兴趣,可以想办法吧第一次的时转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net候错误去除掉。

【本文受版权保护】【转载请注明来源】【原创内容,转载请注明出处】

这个用法看上去很挫,但是很厉害的是,可以【作者:唐霜】【作者:唐霜】通过这个思路,实现字符串模板的次第渲染。【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。可以控制渲染到哪个位置。

原创内容,盗版必究。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

总结一下【转载请注明来源】

【版权所有,侵权必究】【未经授权禁止转载】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【作者:唐霜】

写了这么多,总结一下yield,实际上:

【作者:唐霜】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【本文首发于唐霜的博客】
  1. 只能在Generator函数内部使用【版权所有】唐霜 www.tangshuang.net
  2. 【原创不易,请尊重版权】【本文受版权保护】【本文受版权保护】未经授权,禁止复制转载。
  3. 运行.next(),遇到一个yield命著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。令,就暂停
  4. 【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【作者:唐霜】
  5. .next()的返回值表示一个状态{va未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。lue,done}
  6. 著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【作者:唐霜】
  7. 再运行.next(),从之前遇到的那个转载请注明出处:www.tangshuang.netyield [表达式]处(后)继续恢复运行本文版权归作者所有,未经授权不得转载。
  8. 【作者:唐霜】未经授权,禁止复制转载。【转载请注明来源】
  9. 当.next()传参的时候,【版权所有】唐霜 www.tangshuang.netyield [表达式]整个被替换为传入的参数。【版权所有】唐霜 www.tangshuang.net
  10. 【转载请注明来源】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。

最后,说一下for…of是怎转载请注明出处:www.tangshuang.net【未经授权禁止转载】么运行的。

【作者:唐霜】转载请注明出处:www.tangshuang.net【未经授权禁止转载】【版权所有,侵权必究】未经授权,禁止复制转载。
function *foo() {
  yield 1;
  yield 2;
  yield 3;
  return;
}
for(let v of foo()) {
  console.log(v);
}

for…of在遍历foo()【本文首发于唐霜的博客】【本文受版权保护】返回的结果时,每遇到一个yield,就把转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.netyield后面表达式的结果作为of前面的【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】v的值进行赋值(next()返回值的va本文作者:唐霜,转载请注明出处。【本文受版权保护】lue字段)。没错,就这么不要脸的解释完本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net了。

【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【本文受版权保护】

最后的最后,这篇文章不是为了解释和学习G【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netenerator的,所以要了解更多Gen未经授权,禁止复制转载。【本文首发于唐霜的博客】erator,请继续关注我的博客:)

未经授权,禁止复制转载。未经授权,禁止复制转载。原创内容,盗版必究。【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】

2016-10-27 17560

为价值买单,打赏一杯咖啡

本文价值175.6RMB
已有3条评论
  1. HikariLan 2023-04-11 08:40

    受教了,谢谢

  2. 十甫寸木南 2020-11-25 17:29

    我发现了一个错误(不确定是不是文章中的错,或者是我和博主用的js环境不一样,我用的Edge 87.0.664.47 控制台),错误位置在这:↓
    https://www.tangshuang.net/2862.html#把yield当变量看(上一行)(没法贴图😢)

    但是,经过我的实验,发现yield会将后面跟的一整行表达式全部当成一坨(不加括号的话)↓
    “`javascript
    var foo = function *() {
      var x = 1;
      var y =
      yield (x + 1);
      var z = yield x + y;
      return z;
    }()
    foo.next() // {value: 2, done: false}
    foo.next(3) // {value: 4, done: false}
    “`

    而且,我发现,next()中传参数的话,上一个yield的结果是被永久替换的,这一点算是补充吧↓
    “`javascript
    var foo = function *() {
      var x = 1;
      var y =
      yield (x + 1);
      var z = (yield 2) + y + 2 + 2 + y;
      return z;
    }()
    foo.next() // {value: 2, done: false}
    foo.next(3) // {value: 2, done: false}
    foo.next(4) // {value: 14, done: true}
    “`

    • 否子戈 2020-11-25 22:30

      我之前的表述有点问题,已经更新了,多谢提醒。