热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaScript中yield的深入解析

本文探讨了JavaScript中yield关键字的使用及其在生成器函数中的行为,特别是当全局变量被修改时的情况。

在 Javascript 中,生成器函数(Generator Function)通过使用 yield 关键字来实现异步编程。生成器函数允许你在函数执行过程中暂停,并在需要时恢复执行。下面是一个示例代码,展示了生成器函数的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
function step(gen) {
    var it = gen();
    var last;

    return function () {
        last = it.next(last).value;
    }
}

var a = 1;
var b = 2;

function* foo() {
    a++;
    yield;
    b = b * a;
    a = (yield b) + 3;
}

function* bar() {
    b--;
    yield;
    a = (yield 8) + b;
    console.log("这个时候的a", a); //9
    b = a * (yield 2);
}

// 确保重新设置a和b
a = 1;
b = 2;

var s1 = step(foo);
var s2 = step(bar);

// s2 和 s1 的返回是独立的
s2();
s2();
s1();
s2();
s1();
s1(); // 倒数第二步

console.log('最后一步之前a', a, 'b', b);
s2(); // 最后一步
console.log('a', a, 'b', b);

我的疑惑是,在倒数第二步时,全局变量 a 已经被修改为 12。然而,在执行最后一步 s2() 时,b = a * (yield 2) 这个表达式的左边部分按逻辑应该是 b = a * 2。为什么最终 b 的值变成了 18?执行最后一步 s2() 时,a 的值仍然是 9?

原因在于生成器函数的执行过程。当调用 it.next(value) 时,传入的 value 会被赋值给 yield 表达式的左侧。在最后一次调用 s2() 时,yield 2 返回的是 2,而 a 在此之前已经通过 (yield 8) + b 被修改为 9。因此,b = 9 * 2,最终 b 的值为 18。


推荐阅读
  • 本文详细探讨了JavaScript中四种获取CSS样式的不同方法:style、currentStyle、getComputedStyle和getBoundingClientRect。每种方法的适用场景及其兼容性问题,并提供了解决方案。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本文介绍了一个优化过的JavaScript函数,用于从API获取电影信息并渲染到网页上,同时注册Service Worker以提升用户体验和性能。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 深入解析ES6至ES8的新特性与应用
    本文详细介绍了自2015年发布的ECMAScript 6.0(简称ES6)以来,JavaScript语言的多项重要更新,旨在帮助开发者更好地理解和利用这些新特性进行复杂应用的开发。 ... [详细]
  • 本文将指导如何向ReactJS计算器应用添加必要的功能,使其能够响应用户操作并正确计算数学表达式。 ... [详细]
  • 本文探讨了在多种编程语言中实现Hello World输出的方法,从经典的C语言到现代的JavaScript,每种语言都有其独特的表达方式。 ... [详细]
  • 交互式左右滑动导航菜单设计
    本文介绍了一种使用HTML和JavaScript实现的左右可点击滑动导航菜单的方法,适用于需要展示多个链接或项目的网页布局。 ... [详细]
  • 优雅实现 jQuery 折叠展开下拉菜单
    本文介绍了一种使用 jQuery 实现的优雅折叠和展开效果的下拉菜单,通过简单的 HTML 结构和 CSS 样式,结合 jQuery 脚本,可以轻松创建出美观且功能强大的下拉菜单。 ... [详细]
  • YB02 防水车载GPS追踪器
    YB02防水车载GPS追踪器由Yuebiz科技有限公司设计生产,适用于车辆防盗、车队管理和实时追踪等多种场合。 ... [详细]
  • 本文介绍如何在Laravel框架中集成微信支付功能,包括如何配置微信支付环境、处理支付请求及接收支付回调等关键步骤。 ... [详细]
  • JavaScript 中使用 substring 方法截取字符串
    本文介绍了如何在 JavaScript 中使用 `substring` 方法来截取特定部分的字符串,并通过一个实例展示了如何从日期字符串中提取月份和日期。 ... [详细]
  • 本文详细探讨了JavaScript中new操作符的内部机制及其在对象实例化过程中的作用,帮助开发者更好地理解和应用这一核心概念。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • Vue 3.0 翻牌数字组件使用指南
    本文详细介绍了如何在 Vue 3.0 中使用翻牌数字组件,包括其基本设置和高级配置,旨在帮助开发者快速掌握并应用这一动态视觉效果。 ... [详细]
author-avatar
平凡天使007
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有