首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【译】编写高质量JavaScript模块的4个最佳实践

这很好,但是如何构造模块呢?一个模块应该有多少个函数? 这篇文章介绍了有关如何更好地组织JavaScript模块的4种最佳实践。...1.优先使用命名导出 当我开始使用JavaScript模块使用默认的语法来导出模块定义的单个块,不管是还是函数。...`; } } 随着时间的推移,注意到了重构默认导出的(或函数)的困难。重命名原始,使用者模块名没有改变。 更糟糕的是,编辑器没有提供有关要导入的名的自动完成建议。...注意:使用 React,Lodash 等第三方模块,默认导入通常是可以的。默认的导入名称是一个不变的常量:React,_。 2.导入期间不进行繁重的计算工作 模块级别范围定义了函数、对象和变量。...myModule的模块级范围应该只定义包含少量内容的函数或变量。 一个组件应该有多少个函数,这些组件应该如何与每个组件相关联?支持高内聚的模块:它的组件应该紧密相关并执行一个共同的任务。

94320

JavaScript重构技巧 — 对象和值

本文中,我们将介绍一些优化 JS 和对象的重构思路。...用常量来表示数字 如果我们有很多重复的值且表示一样的含义,但没有明确地说明,那么我们应该将它们转换为常量,以便每个人都知道它们的含义,并且如果需要更改,我们只需更改一个地方就行了。...封装字段 我们可以将getter和setter添加到的字段,这样就不心直接对的字段进行操作。..._name = name } } 这样,我们就可以控制如何设置值,因为我们可以setter中放入代码来设置名称。我们还可以控制谁能获得名称,因为它是getter返回的。...用状态/策略替换类型代码 有时,我们可以根据对象的类型创建子类,而不是中使用类型字段。这样,我们就可以它们自己的子类拥有两个不共享的更多成员。

95110
您找到你想要的搜索结果了吗?
是的
没有找到

JavaScript 重构攻略

————————————————————————————————————– 三、JavaScript 的测试 进行 JavaScript 重构希望引入易于使用的测试框架来保证重构的顺利进行,未来能持续通过测试代码对...变量和方法控制: 模块开发不允许存放独立的全局变量、全局方法,只允许把变量和方法放置相应模块的 “命名空间” 。实在心痒了,那么使用匿名函数如何?...DOM 操纵规则: 模块代码,通常要求把对 DOM 的操纵独立模块 js ,应当避免 DOM 模型上显示地写时间触发函数,例如: 借助 JQuery...5、关联常量预置模块,这部分主要是一些系统常量无法 JavaScript 确定下来,需要外部传值进去。...: 比如语言文字从右向左排列和从左向右排列是造成某些展示不同的根本原因,那么关联常量预置模块设置好语种,涉及的语种和左右排列方向的对应关系应当存放在代码,最后 JavaScript 代码中区分对待就可以了

1.8K20

学会使用函数式编程的程序员(第1部分)

addOneToSum 是一个函数,有两个参数分别为y和z。 let块,x被绑定1的值上,也就是说,它在函数的生命周期内都等于1。...重构 让我们考虑一下重构,下面是一些Javascript代码: 我们以前可能都写过这样的代码,随着时间的推移,开始意识这两个函数实际上是相同的,函数名称,打印结果不太一样而已。...换句话说,函数通常是另一个函数的值。 由于函数只是值,我们可以将它们作为参数传递。即使Javascript不是纯函数语言,也可以使用它进行一些功能性的操作。...现在可以调用高阶函数(这在Javascript中有效,因为Regex.exec找到匹配返回一个truthy值): validateValueWithFunc('123-45-6789', /^\d{...当一个函数被创建,它在创建作用域中的所有变量函数的生命周期内都是可访问的。一个函数只要还有对它的引用就存在。

66730

抛弃变量,编写更加可读的JavaScript代码

JavaScript本质上是命令式语言,它也有一个动态类型系统。静态类型语言,类型系统提供了一些有关变量的线索。但是使用JavaScript,却没有这种安全性。人们一直在想方设法解决这个问题。...但在实践,大多数时间你不会注意其中的差别。如果你打开一个分析工具并且仔细观察,可能会看到某部分代码运行了3毫秒,而不是1毫秒,但是你不会注意一个按钮点击之后产生的延迟。...但如果你之后并没有用过这个变量,你仍可以对它进行安全删除。 但是也有个缺点,就是我们JavaScript可能很难编写纯粹的函数式代码。...这将帮助读代码的人辨别出哪一部分可以进行安全重构,哪一部分是比较危险的。不要在闭包修改任何代码,因为人们通常不会认为这里会产生副作用。 只将副作用写在短小的函数。...上面写的示例都是使用的ES6的函数,还有很多其他的库能提供类似或者更多的函数。你可以查阅 Underscore.js , lodash 以及 immutable-js。

48730

代码重构(一):函数重构规则

下方将会通过一个示例来直观的感受一下Extract Method,当然这些示例不是原创的,是《重构:改善既有代码的设计》Java示例演变的Swift版,写Swift代码,对原有的示例进行了一些修改...也就是说当你看到该函数名字,你就应该知道该函数是干嘛的。 下方代码段就是我们重构后的。说白的,就是对函数可以进行独立的模块进行提取,并为提取的新的函数命一个合适的名称。...getPrice()函数的第一个红框中有一个basePrice临时常量,该常量有一个较为复杂的赋值表达式,我们可以对其使用Replace Temp with Query进行重构,可就是创建一个函数来返回该表达式的值...顾名思义,就是函数不要对函数参数进行赋值。也就是说你函数的作用域中不要对函数的参数进行赋值(当然,输入输出参数除外),当直接对函数的参数进行修改时,对不起,此时你应该对此重构。...所为我们可以再次对上述方法进行重构重构后的具体代码如下: ? 今天的博客主要讲了如何对既有代码函数进行重构本篇博客中提到了8大规则。

1.5K50

重构》再版——听Martin Fowler聊聊新版的故事

在这个一小的访谈,Martin从以下几个方面表达了对重构的看法: 为什么重构仍然是开发人员重要的技能组成部分 如何最好地通过重构来改进代码 在过去的二十年里,重构发生了怎样的变化 现在这本书的纸质版以及各种电子版本都可以...我们要意识,随着代码被构建成新的结构,可以存在也可以消失。 从2015年2016年初,写了一系列文章来探讨重构的各种情况,这帮助我明确是否应该重写。如果要重写,又应该如何进行。...2016年年已经做好了重写这本书的准备。所以你应该了解了为什么没有像以前那样频繁的博客撰文,那是因为从那以后的精力一直集中重写这本书上。...当我写作中选择一种语言作为示例主要从读者角度进行考虑。想“哪种语言能帮助大多数读者理解这本书中的概念?”...但是,不选择Java而选择它的一个重要原因是它不完全以为中心。它有顶层函数,也经常使用一级函数。即使脱离的语境,重构也显得很容易。

1.2K20

如何JavaScript 编写你的第一个单元测试

确定范围 使用单元测试框架使我们能够快速编写和自动化我们的测试,并将它们集成到我们的开发和部署过程。这些框架通常支持在前端和后端的JavaScript代码中进行测试。...例如一个函数什么时候应该抛出异常,或者它应该如何处理接收到的畸形数据。 分解复杂功能 含有大量逻辑的大型函数很难测试;包括太多的操作,无法有效测试每个变量。...如果一个函数过于复杂,可以将其分割成较小的函数进行单独测试。 避免网络和数据库连接 单元测试应该快速且轻量,但是函数会发出网络请求,或者连接其他程序并花很长时间执行。...如何编写单元测试 现在,我们已经回顾了一些单元测试的最佳实践,你已经准备好在JavaScript编写你的第一个单元测试。 本教程使用了Mocha框架,它是最流行的单元测试之一。...从我们的单元测试,我们知道这个函数没有正确地返回到绿色。我们可以看到,目前的代码lightIndex值超过交通灯颜色的数量进行检查,但索引是从0开始的。

87920

翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 6 章:值的不可变性

重新赋值 进入下一个段落之前先思考一个问题 —— 你如何描述“常量”? … 你可能会脱口而出“一个不能改变的值就是常量”,“一个不能被改变的变量”等等。...认为你应该使用 var 或 let 来声明那些你会去改变的变量,它们确实相比 const 来说是一个更明确的信号。 const 所带来的问题还没讲完。还记得我们本章开头所说的吗?...写过很多,也阅读过很多 JavaScript 代码,认为由于重新赋值导致大量的 bug 这只是个想象的问题,实际并不存在。 我们应该担心的,并不是变量是否被重新赋值,而是值是否会发生改变。...你可以向函数传入一个数组,这个数组可能会在你没意识的情况下被改变。但是你的其他代码预期之外重新给变量赋值,这是不可能发生的。...在内部,它可能就像一个对象引用的链表树,树的每个节点都表示原始值的改变。从概念上来说,这和 git 的版本控制原理类似。 ?

1.2K50

代码减肥

每个变量名都该命名 可以用 buddy.js 或者 ESLint 检测代码未命名的常量。...当函数确实需要副作用时,比如对文件进行 IO 操作,请不要用多个函数/进行文件操作,有且仅用一个函数/来处理。也就是说副作用需要在唯一的地方处理。...副作用的三大天坑:随意修改可变数据类型、随意分享没有数据结构的状态、没有统一地方处理副作用。 避免副作用(二) JavaScript ,基本类型通过赋值传递,对象和数组通过引用传递。...为了避免这种问题,我们需要在每次新增商品,克隆 购物车数组 并返回新的数组。 不要写全局方法 JavaScript ,永远不要污染全局,会在生产环境中产生难以预料的 bug。...很明显你们方法会产生冲突,遇到这类问题我们可以用 ES2015/ES6 的语法来对 Array 进行扩展。 比起命名式更喜欢函数式编程 函数式变编程可以让代码的逻辑更清晰更优雅,方便测试。

68020

代码重构新手教程:如何将烂代码变成好代码?

每日的 stand-up 会议,当研发经理问我,你今天干什么了,重构代码,如果连续三天都是这个答案,估计研发经理就要发飙了。 没有时间去做。...废弃的代码 随着系统版本的不断迭代,有一些函数不再使用后,我们应该将它及时删除,否则随着时间流逝,会造成代码库臃肿,程序可读性变差。...如果你要对已有代码错误的命名方式进行修改,eclipse 提供了很好地支持:选择要修改的函数或变量,选择 Refactor——》Rename 可以同时修改该变量声明和使用处的名称,如下图所示:...以上是对入门级重构方法的介绍,进行重构,最重要的规则是:每次只做微小修改,并保证测试能正确运行(小步快跑)。 重构进阶 现在我们对重构已经有了基本的了解,并建立了初步的信心。...如果它们被赋值超过一次,就意味着它们函数承担了一个以上的职责。如果临时变量承担多个责任,它就应该被替换为多个临时变量,每个变量只承担一个责任。

57020

写出好程序的11个技巧

拒绝神秘数字   当你要把什么东西跟一个常量值做比较,记得把这个值定义成常量。没有什么会比去猜测你的同事写的这样的代码更让人头疼的事了:   il < 4384   换个形式感觉如何?   ...让我们看看其中的一些习俗规范: 方法名应该小写字母开头,其后用字母大写的单词连接(veryLongVariableName) 应该都使用首字母大写的单词连接而成 常量应该全部大写,用下划线连接(MY_CONSTANT...) 左大括号应该跟 if 语句同一行   只有在有必要的理由才去打破这些常规,不要轻易的因为你不高兴就违反它。...不论何时重构后,只要运行一下所有的测试用例,你就能准确的知道什么地方出了问题。 10. 不要过度沉迷于技巧   当我第一次读到有关设计模式的知识觉得找到了圣杯。...往现有的应用里增加新的库或框架同属于这种情况。就说你写了一个Javascript的web应用,期间,你发现了jQuery。

76350

【笔记】《重构: 改善既有代码的设计》

;当发现某些功能重构后可以变得容易添加可以重构 修补错误:遇到bug进行, 因为代码结构没有清晰让我们一眼看出bug 复审代码:重构可以让我们更快理解别人的代码且发现他人代码结构的问题....对于他人代码的错误可以以极限编程的思路直接动手重构, 但是如果项目过大则应该以图示提交重构的思路 “如果我们纯粹只是为了今天工作, 明天将无法工作” 我们希望程序:(1)容易阅读;(2)所有逻辑都只唯一地点指定...提炼的时候可能会产生过长的参数列表, 考虑如何将长参数包装为一个参数对象进行传递 3.3 过大的 和大函数一样, 当某个负责了太多内容就会产生冗余和混乱, 最好按照进行的工作为每个方法都提炼出接口...测试一种方法是对每个都有自己的testing函数负责校验功能, 但是这样不太好操控, 更好的方法是建立一个独立, 一个外部框架中进行测试 4.2 JUnit测试框架 目前不写java所以这个东西的实际使用对意义不大...如果目标函数使用了源的特性,你得决定如何从目标函数引用源对象。如果目标没有相应的引用机制,就把源对象的引用当作参数,传给新建立的目标函数

1.5K20

异步函数的异常处理及测试方法

/ 可以 Javascript 的异步函数抛出错误吗?...你将学到什么 通过后面的内容你将学到: 如何Javascript 的异步函数抛出错误 如何使用 Jest 测试来自异步函数的异常 要求 要继续往下读你应该: 对 Javascript 和 ES6...也可以从 ES6 的抛出错误。 Javascript 编写总会在构造函数输入意外值。下面是一个例子: ? 以下是该类的测试: ? 测试确实通过了: ? 安排的明明白白!...所以无论异常是从常规函数还是从构造函数(或从方法)抛出的,一切都会按照预期工作。 但是如果想从异步函数抛出错误怎么办? 可以测试中使用assert.throws吗? 各位看官请上眼!...以下是Jest测试异常的规则: 使用 assert.throws 来测试普通函数和方法的异常 使用 expect + rejects 来测试异步函数和异步方法的异常 如果你对如何使用 Jest

2.9K30

【Java 进阶篇】JavaScript变量详解

如何定义JavaScript变量 JavaScript,我们可以使用以下关键字来定义变量: var:这是定义变量的最早的关键字,但在ES6(ECMAScript 2015)之后,let和const...3.14159; // 使用const定义常量 JavaScript变量的命名规则 JavaScript,变量的命名必须遵循一些规则: 变量名必须以字母、下划线(_)或美元符号($)开头。...的作用域是嵌套的,这意味着在内部作用域可以访问外部作用域的变量。...var:ES5及其之前的版本,var是定义变量的主要方式。它具有函数作用域,这意味着它在函数内部声明的变量函数外部是不可见的。...const pi = 3.14159; pi = 3; // 不能修改常量,将会抛出错误 JavaScript变量的最佳实践 在编写JavaScript代码,有一些最佳实践可以帮助我们更好地管理变量:

18010

代码量锐减 80%,一次祖传代码重构实践

当两个层次相同的存在相同的方法,就把方法提出出来,上移到一个上层的或者独立的方法。比如上面的编码函数不同的中都存在,最后我们将该方法提取出来了,并复用了可以共用的部分。...当一个函数代码行数越来越多的时候,不愿意去承担重构的风险。如果要新加一个功能,主流程加上的逻辑是最保险的。如果要去改动别人的代码,即使只是提取出来作为一个函数需要承担更多的风险。...当我阅读完这个的代码,觉得读完了一本书,要睡着了。 4.2 动机 最开始,仅仅有一个策略逻辑。这个逻辑放在请求处理觉得理所应当。...4.3 预防和拯救措施 每个应该在注释说明该类职责。当实例过多时,应当想办法拆解,把一部分职责委托为其他。...10.2 动机 针对 badcase 进行特殊处理,懒得写注释了,也不想花时间定义常量。 10.3 预防和拯救措施 针对常量,遵循代码规范,使用常量定义,并添加注释。

77171

36个助你成为专家需要掌握的JavaScript概念

虽然知道C和Java等语言中“按引用传递”和“按值传递”的概念,但我不确定它在JavaScript如何工作的。...通过理解这些概念,你可以更好地理解JS底层是如何工作的,以及如何解释你的代码。 10、时间间隔 要在JavaScript调度一个调用或函数,可以使用两种方法。...其他编程语言都使用,所以JavaScript语法使得开发人员不同语言之间的转换更加简单。” 工厂函数是一个不是或构造函数但是返回对象的函数。...JS大师Eric Elliot说:“JavaScript,任何函数都可以返回一个新对象。当它不是构造函数,就称为工厂函数。”...这些方法是调用具有适当上下文的函数所必需的。传递访问这个的回调,你将特别需要bind方法。是在帮助一个朋友调试他的代码学到这一点的!

70020

手把手,带你编写你的第一个单元测试

当我们一个系统里边修改了很多代码,但又不确定改动是否影响核心逻辑,是否会导致项目原来的功能出现bug。我们就可以使用单元测试来帮助我们来进行测试。...对代码进行单元测试,我们不仅仅要确保函数输入正确的值,有正确的输出,还要确保函数输入错误参数,运行的结果是失败的。这些对错误的检查更有利于我们预测引发错误的原因以及场景。...拆分复杂的函数 对功能逻辑复杂的函数,编写单元测试是十分困难的。我们要把复杂的函数拆分为相对较小的函数进行单元测试。避免测试涉及数据的请求(数据库and网络请求) 单元测试应该是快速和轻量级的。...并防止我们后期重构代码再次产生同样的错误。它可以让我们的项目后期更易于管理和维护,即使我们的项目代码体积结构变得更大更复杂——尤其是更大的开发团队。...而且自动化单元测试还能够让开发人员重构和优化代码,不必担心新代码的是否会影响旧的功能。单元测试是开发过程的关键部分,对于帮助您构建更好、更安全的 JavaScript 应用程序至关重要。

17920

webpack4.0正式版重大更新与特性详细清单

*标志对此进行详细配置(构建您的自定义模式) process.env.NODE_ENV被设置为生产或开发(仅在构建的代码,而不是配置) 有一种隐藏的none模式可以禁用所有的功能 你现在必须在两种模式之间选择...JSON模块 将JSON通过加载器转换为JS,可能需要添加type: "javascript/auto" 只使用JSON而无需加载器应该仍然有效 webpack现在原生处理JSON 允许通过ESM语法导入...它们允许使用动态表达式过滤文件。...解析器使用StackedSetMap(类似于LevelDB的数据结构)而不是Arrays 应用插件不再设置Compiler.options 和谐相依性因重构而改变 Dependency.getReference...Dependency.weak现在由Dependency基使用,并返回到getReference()的基本实现 所有模块的构造函数参数都已更改 将选项合并到ContextModule和resolveDependencies

2K30

自动化测试最新面试题和答案

每当调用getConnection()方法,DriverManager都会检查可以连接到URL中指定的数据库的所有已注册的Driver的列表。...如果XPath文档的任意位置开始进行选择匹配,那么它将允许创建“相对”路径表达式。 例如 “// p”匹配所有的段落元素。 问题9:如何编写Selenium IDE / RC的用户扩展?...用户扩展(UX)存储Selenium IDE或Selenium RC用来激活扩展的单独文件。它包含用JavaScript编写的函数定义。...、CSS定位器,应该使用哪一个?...在这里会简要地解释它们,以及它们系统测试生命周期中如何发挥作用的。 TDD - 测试驱动开发。 也被称为测试驱动设计,是一个软件开发的方法,源代码上重复进行单元测试。写测试、看它失败、然后重构

5.8K20
领券