IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> JS调用链 -> 正文阅读

[JavaScript知识库]JS调用链

函数调用

JS中函数之间存在创建,调用关系,这种关系是强关联关系。

函数调用时操作的数据,除了入参,还有其作用域链上能访问的数据。函数的作用域是其定义的地方。

不同的函数可能经作用域链访问和操作同一个数据,他们之间的关系是弱关联关系。

各种不同的强关联、弱关联关系是程序微观执行时的一种形态。
对象在一定程度上也可以大致抽象认为是函数,是一组函数,拥有相同的上下文,并且自身可维持状态。

调用链

函数之间通过调用关系形成一条链,称之为调用链。函数是调用链上的一个环节,一个点。

调用链有头有尾执行从前往后,可以用一条线来表示,为简化用一条直线表示。

调用链的头和尾是相对的,取决我们的观察需要。一条链可以一分为二分别进行分析。

一般调用链的头是从系统的交互界面或边界接口开始的。

依赖链和调用链是软件静态结构的一种表现,而调用链执行起来,则完成了软件的功能。

不同的调用链,都包含同一个函数,那么就认为它们相交,交点就是这个函数。

程序当中,有许多调用链,并且他们可能多次相交。

调用链不管相交与否,他们中任何两个函数都拥有相同的依赖,那么就是隐形相交。

调用链存在分叉的情况,主链可产生多个次(支)链。主链可能存在多个分叉点。而次链又可以产生次次链。

调用链总体可以看作是一种树形结构,而各种交点就是树中的结点。很多时候情况比较复杂,甚至形成了图的结构。

调用链的特性

对于软件,微观上每一条调用链执行正常,宏观上软件功能才能正常。

某条调用链上每一点运算都是正确的,那么该条调用链运行就是正确的。

函数调用或调用链运行符合期望,称之为正确性

调用链中的一点发生故障(计算错误,抛异常等),该点以后链的正确性被破坏。

链交叉点及以前的地方出现故障,该点及以后的链正确性被破坏。

对于主次链,分叉点前出现故障,该点及以后所有次链正确性被破坏。

可以理解,链上的点的正确性依赖前一个点的正确性。或者是说,调用链的正确性向前依赖

调用链存在相交,导致计算的非正确性具有传染性。A链的存在bug,会导致相交的B链也可能运行出错。

相交越多,传染性越强。耦合性就是具体的体现。

随着需求迭代,调用链会发生改变,会增长缩短断裂等。手抖了也会导致链的改变。

调用链的易变性,导致我们常常遭遇莫名其妙bug的困扰。

调用链的易变性,也让我们可以随心所欲的修改链,删减链,嫁接链来实现我们想要功能。

开发一个功能,甚至可以简单的认为是加一条链就好了。

调用链链接的地方就是发生函数调用的地方,可以称为截面。

在截面上可以进行数据的检查,过滤,改造等操作。截面也随时随地可以嫁接或生成新的链。

调用链并不是无脑的调用,调用链上传递了信息、数据或逻辑。数据不会无缘无故从A模块到B模块,必须通过调用链传递过去。

调用链执行形成的调用流可形成管道作用运输信息流、数据流、逻辑流。

现在流行的MVVM框架,其维护的数据不会自动渲染成视图,其必依赖于一条调用链来达成。而这个调用链的源头往往就是监听数据的改变。

调用链每一个环节可能维持状态,导致调用链整体体现的状态有不确定性。不确定性导致调用链每从头到位执行一次,其表现的功能是不一样的。

调用链形成后,其中的每一个环节都不能轻易改变,否则该点之后链的正确性会受到影响。

调用链往前越僵化,往后越灵活,表现出头重脚轻的特性。

调用链的执行是向后进行的,但是走到链的末端,会逐个向前返回调用结果,直到链的开头。调用链有种回归的特性。

利用回归特性,想要任何的数据,可以通过一个调用链去获取。递归调用也是利用了这个特性。

基于调用链分析的实践建议

1.调用链之间没有交叉/分叉最好,这样链执行的正确性只和自己有关,满足低耦合的特征。

如果一定交叉/分叉,那么一方面减少交叉/分叉点数量,一方面将交叉/分叉点往后移,减少影响范围。

相对的,经常变化的逻辑,放在链的末端,而链的前端应当非常健壮。

调用链承载逻辑链,业务链。次链的一部分逻辑写在主链里,那么如果这部分逻辑发生故障或变更,其他次链的正确性就会受到影响。

所以主链避免处理次链的具体逻辑,最好充当管道的形象,传递调用流和无特定意图的数据。

具体的逻辑,放在次链里处理,满足高内聚的特征。可以称之为重心后移

许多开发框架,经常充当生成和触发主链的角色,而我们实现的逻辑放在主链的次链中。这个交叉的地方,常被称之为钩子

2.调用链最好是无状态的,这样每次运行的结果都是一致的。

为了降低非正确性概率,希望更多使用纯函数和无副作用函数来确保程序的正确性,减少链隐性相交,减少状态带来的不确定性。

如果要引入状态,那么这些状态要么需要进行集中管理,要么就放在链的末端,降低风险。

说到副作用,也是很有用的一种技术,如果使用得当可以很好的起到关注点分离,进而降低耦合的作用。

3.被依赖意味着更多的责任。组件、对象、函数,被依赖了,那么随着迭代,需要变化时就要考虑到影响范围。

组件、对象、函数需要遵守单一职责原则,最小知识原则,接口隔离原则等。水平扩展式的变化比较好。

功能增强式的变化最好是做到向前兼容,并且引入版本管理,即使遭遇断崖式的变化,也可以通过版本控制住影响。

4.应当使用开发框架或定义机制。开发框架内有良好的结构,开发框架承载了最根本的健壮性要求。

没有开发框架,那么我们需要定义一套系统结构或机制来承载系统健壮性要求,特别是应对多人协作和快速迭代。

??

?(持续完善中,仅供交流,不喜勿喷~o~)

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:13:51  更:2021-11-29 16:15:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:48:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码