js中yield参数应用示例深入理解

目录
  • yield是什么
    • yield应用的简单例子
    • demo1
  • 错误的调用
    • demo2
  • 一些说明
    • next()函数及参数
    • yield参数的对比
  • 更深层次的理解yield
    • 分析
    • A组
    • B组
  • 目前项目中的可用性

yield是什么

  • yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
  • yield关键字实际返回一个IteratorResult(迭代器)对象,它有两个属性,value和done,分别代表返回值和是否完成。
  • yield无法单独工作,需要配合generator(生成器)的其他函数,如next,懒汉式操作,展现强大的主动控制特性。

yield应用的简单例子

demo1

  • 如果你看到某个函数中有yield,说明这个函数已经是个生成器了
  • yield可以用来加强控制,懒汉式加载
  • 调用函数指针和调用生成器是两码事,注意上面的运行结果,countAppleSales和myArr。
  • 需要next()函数配合使用,每次调用返回两个值:分别是value和done,代表迭代结果和是否完成
  • 函数next()是个迭代器对象,传参可以缺省,默认调用函数。

错误的调用

demo2

上述错误的调用中,会的到如下结果

{ value: 7, done: false }

{ value: undefined, done: true }

因为在while判断中的next也会进行消耗,导致输出结果与预期不符,得到的只是符合条件的偶数项

一些说明

  • yield并不能直接生产值,而是产生一个等待输出的函数
  • 除IE外,其他所有浏览器均可兼容(包括win10 的Edge)
  • 某个函数包含了yield,意味着这个函数已经是一个Generator
  • 如果yield在其他表达式中,需要用()单独括起来
  • yield表达式本身没有返回值,或者说总是返回undefined(由next返回)
  • next()可无限调用,但既定循环完成之后总是返回undeinded

next()函数及参数

  • 在js中,虽然借鉴了python的函数,但是也进行了自己的改造,由于没有send()函数,所以无法直接传递yield的值。
  • next()可以带一个参数,该参数会被认为是上一个yield整体的返回值,稍后将在代码中展示。
  • 在某种程度上,next()可以直接当做send()使用

它的意义在于,可以在不同阶段从外部直接向内部注入不同的值来调整函数的行为(这一点是其他循环很难做到的,或要付出较大的代价才可以做到)

yield参数的对比

js

python

  • 对js中generator函数进行改造,对比右边的python中的yield,它们原理一样,只是调用方式不同
  • 调用next(),会产生许多i的值, 但是不会影响reset,因为yield直接将值return出来了。
  • 当传值true后,yield及他的参数整体变为true赋值给reset,这是reset会被执行,从而满足循环内的判断条件
  • 这里的使用 next(参数) 已经达到了send(参数)的效果
  • 这并不会平白增加循环的时间复杂度,因为不传参的时候,并不会占用更多的内存

更深层次的理解yield

如果刚才没有让你有一个清晰的认识,那么这个例子一定会让你彻底明白的

传参

分析

next() 传参是对yield整体的传参,否则yield类似于return

A组

  • x恒为5,所以第一次调用传空没问题,可得到对应的第一个yield返回值:yield (x + 1)
  • 第二次调用,无参数传入,所以y为NaN(2* undefined),自然得不到z
  • 第三次调用同上分析

B组

  • x恒为5,所以第一次调用传空没问题,可得到对应的第一个yield返回值:yield (x + 1)
  • 第二次调用,传入12,所以y为24(yield (x + 1)=入参),得到第二个yield: yield (y / 3)=8
  • 第三次调用同上分析,得到最后的z值并return=42

目前项目中的可用性

在前端项目中,用的机会很少,完全可以忽略他的存在,但是在后台项目中,就显得比较重要了,因为其优越的可控性,可是极大的提升线程的效率。

目前只是根据官网,ES6规范,大站等总结出来的,但是很遗憾,目前我们的项目中由于node项目较简单,并不需要进行实际改造。

如果需要实例的话,可参考github上的一些python后端项目,调用方式稍有不同,由于js参考的python语言,他们又同为动态语言,所以原理都是相同的,用处也一样。

以上就是js中yield参数应用示例深入理解的详细内容,更多关于js yield参数应用的资料请关注我们其它相关文章!

(0)

相关推荐

  • JavaScript中yield实用简洁实现方式

    刚才忽然灵机一动,迭代器我们很少会真的直接傻乎乎的next去遍历的,那为什么一定要实现这个傻乎乎的next呢?直接实现each,这样,这样反过来,Yeah,一通百通,不一会儿就写出了第一个超简洁版本: 复制代码 代码如下: function yieldHost(yieldFunction) { return function (processer) { var yield = function (result) { processer(result) }; yieldFunction(yield

  • javascript实现yield的方法

    没想到代码一次测试成功.~~只不过是FF下面,修改一下支持IE了.由于IE不认function表达式. 复制代码 代码如下: var Iterator = function (fn) {            var coroutine = null;            var cofn_this = null;            var yield = function() {                coroutine.apply(cofn_this, arguments); 

  • JavaScript使用yield模拟多线程的方法

    本文实例讲述了JavaScript使用yield模拟多线程的方法.分享给大家供大家参考.具体分析如下: 在python和C#中都有yield方法,通过yield可以实现很多多线程才能实现的功能. 对javascript有版本要求:JavaScript 1.7 function Thread( name ) { for ( var i = 0; i < 5; i++ ) { Print(name+': '+i); yield; } } //// thread management var thre

  • js中yield参数应用示例深入理解

    目录 yield是什么 yield应用的简单例子 demo1 错误的调用 demo2 一些说明 next()函数及参数 yield参数的对比 更深层次的理解yield 分析 A组 B组 目前项目中的可用性 yield是什么 yield是ES6的新关键字,使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者.它可以被认为是一个基于生成器的版本的return关键字. yield关键字实际返回一个IteratorResult(迭代器)对象,它有两个属性,value和done,分别

  • js中json对象和字符串的理解及相互转化操作实现方法

    本文实例讲述了js中json对象和字符串的理解及相互转化操作实现方法.分享给大家供大家参考,具体如下: <script> var str="{'strv':["+ "{'a':'a11'},"+ " {'a':'b222'}"+ " ]}"; //如果放在一行更清楚:var str="{'strv':[{'a':'a11'}, {'a':'b222'} ]}"; var str2=eval('(

  • JS中URL.createObjectURL使用示例讲解

    目录 前言 URL.createObjectURL() 语法 参数 返回值 示例 URL.revokeObjectURL() 语法 参数objectURL Returnvalue 示例 与FileReader.readAsDataURL(file)区别 主要区别 执行时机 内存使用 优劣对比 总结 前言 URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL.这个 URL 的生命周期和创建它的窗口中的 document 绑定.

  • 在JS中解析HTML字符串示例代码

    在js中直接添加html语句,js会将html字符串解析成相应的HTML语句,并在前端进行显示. 复制代码 代码如下: <span style="font-size:14px;">var el = document.createElement( 'div' ); el.innerHTML = "<html><head><title>titleTest</title></head><body>&

  • 如何在spring boot中进行参数校验示例详解

    上文我们讨论了spring-boot如何去获取前端传递过来的参数,那传递过来总不能直接使用,需要对这些参数进行校验,符合程序的要求才会进行下一步的处理,所以本篇文章我们主要讨论spring-boot中如何进行参数校验. lombok使用介绍 在介绍参数校验之前,先来了解一下lombok的使用,因为在接下来的实例中或有不少的对象创建,但是又不想写那么多的getter和setter,所以先介绍一下这个很强大的工具的使用. Lombok 是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很

  • JS中字符串trim()使用示例

    示例一: <head> <title>测试JS扩展方法</title> <script type="text/javascript"> // 合并多个空白为一个空白 String.prototype.ResetBlank = function() { //对字符串扩展 var regEx = /\s+/g; return this.replace(regEx, ' '); }; window.onload = function() { v

  • Angular.js中$apply()和$digest()的深入理解

    $apply()和$digest()介绍 AngularJS提供了一个非常酷的特性叫做双向数据绑定(Two-way Data Binding),这个特性大大简化了我们的代码编写方式.数据绑定意味着当View中有任何数据发生了变化,那么这个变化也会自动地反馈到scope的数据上,也即意味着scope模型会自动地更新.类似地,当scope模型发生变化时,view中的数据也会更新到最新的值.那么AngularJS是如何做到这一点的呢?当你写下表达式如 时,AngularJS在幕后会为你在scope模型

  • vue.js中$watch的用法示例

    前言 vue.js是一个数据驱动的web界面库.Vue.js只聚焦于视图层,可以很容易的和其他库整合.代码压缩后只有24kb Vue.js 提供了一个方法 watch,它用于观察Vue实例上的数据变动.对应一个对象,键是观察表达式,值是对应回调.值也可以是方法名,或者是对象,包含选项. 在实例化时为每个键调用 $watch() ; <template> //观察数据为字符串或数组 <input v-model="example0"/> <input v-m

  • Node.js中调用mysql存储过程示例

    例子仅在windows下测试通过,没有放在linux下测试.如有问题,可以电邮给我~ 1.安装node.js.mysql,此处略(自行搜索吧)-: 2.创建一个名为test的数据库,然后建一张名为user_info的表(仅供测试)- 这里假定mysql使用的用户名为root,密码为123456 相应的mysql如下: 复制代码 代码如下: /** * 创建名为test的数据库 */ DROP DATABASE IF EXISTS test; CREATE DATABASE test; USE t

  • js中parseFloat(参数1,参数2)定义和用法及注意事项

    今天在看jquery的时候里面用到了parseFloat(第一个参数,10),一直不懂第二个参数是什么意思,于是上网查了一下,怕以后忘记就记下来. 定义和用法:parseFloat() 函数可解析一个字符串,并返回一个浮点数. 语法:parseFloat(string),参数string是必须的,表示要被解析的字符串 返回值:返回解析后的数字 注意事项: 1.开头和结尾的空格是允许的. 2.如果字符串的第一个字符不能被转换为数字,那么 parseFloat() 会返回 NaN 3.如果只想解析数

随机推荐