现在有一个需求:

如果“一个字符串”超出“容器宽度”,将字符串截断最后一个字符、并在末尾加上‘...’ ,再次判断是否需要截断。直至字符串小于容器宽度。

下面SliceLabelStr函数采用了递归:
如果文字超出宽度,在attrStyle函数中将原字符截断末尾字符并加上‘...’ 再次调用sliceLabelStr判断是否超出宽度。
直至获得宽度合适的字符串并输出。

需要优化的递归函数
sliceLabelStr = function( textWidth, textStr) {var str;if(超出宽度) {dataLabel2 = attrStyle(textStr);var newTextWidth =  dataLabel2.text && dataLabel2.text.element.getBoundingClientRect().width;var textStr = dataLabel2.text.textStr;sliceLabelStr( newTextWidth, textStr);} else {str = attrStyle(textStr, true);return str; }
}

这样看起来没问题。其实需要优化很多地方。

1、递归没有出口

  1. 这个递归函数被调用了10遍,在11遍的时候符合了出口条件退出了,
    那么在第10遍没退出的时候,1到10次的函数都没有退出,只有在第11遍符合了出口条件return了以后,就会从11~1倒着依次退出

附上一张太阳神手写的解释图

优化方法1
if(textWidth > containerWidth) {dataLabel2 = attrStyle(textStr);var newTextWidth =  dataLabel2.text && dataLabel2.text.element.getBoundingClientRect().width;var textStr = dataLabel2.text.textStr;return sliceLabelStr( newTextWidth, textStr);//有返回值} 

1、上述原因是递归没有出口,而且if语句中调用本函数递归的时候没有返回值。

2、有时会产生“调用栈溢出”的情况。

2、在if判断条件中,由于在某种情况下textWidth没有变化造成了无限递归

3、用do...while 代替 递归

sliceLabelStr = function(forX2Array, textWidth, textStr) {var str,sliceStr = textStr.text && textStr.text.textStr || textStr;if(compareTextLength(forX2Array, textWidth)) {var n=0;do{n++;}while(sliceStr.substr(0,n)!=sliceStr && attrLabel2Style(forX2Array[0], sliceStr.substr(0,n)).getBBox()["width"]<ContainerWidth(forX2Array))return sliceStr.substr(0,n);} else {str = attrLabel2Style(forX2Array[0], sliceStr, true);return str;}
}

逻辑比较直观,简单能用循环的就用循环,递归一般用在复杂算法,比如弗洛伊德,A+之类

4、这是SVGElement,如果是普通的DOM元素。可以用如下方法。

一个递归函数的漏洞及优化相关推荐

  1. thinkphp日志泄漏漏洞_ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法...

    ThinkPHP 3.1.3及之前的版本存在一个SQL注入漏洞,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 文件 根据官方文档对"防止SQL注入" ...

  2. 一个SQL性能问题的优化探索(二)(r11笔记第38天)

    继续前几天的一个案例一个SQL性能问题的优化探索(一)(r11笔记第33天) 如下的SQL语句存在索引字段CARD_NO,但是执行的时候却走了全表扫描,因为这是一个核心表,数据量很大,导致数据库负载很 ...

  3. 测试php框架漏洞,ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法...

    作者: seay 下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑.建议类似的厂商不要再 ...

  4. 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。

    题目要求: 编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值.在main函数中输入一行字符串,分别调用两个函数,输出反序后的 ...

  5. python 速度 memmap_从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

    <从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例>要点: 本文介绍了从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例,希望对您有用.如果有疑问,可 ...

  6. 转 从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例

    注: 转自 微信公众号"高可用架构":从20秒到0.5秒:一个使用Rust语言来优化Python性能的案例 导读:Python 被很多互联网系统广泛使用,但在另外一方面,它也存在一 ...

  7. /plus/recommend.php sql注入漏洞,代码审计:ThinkPHP框架通杀所有版本的一个SQL注入漏洞详细分析及测试方法 | Seay 渗透 编程 代码审计 网络安全博客...

    显示不全请点击全屏阅读 下面是摘自thinkphp官方的一个公告,官方直接贴出这些东西是非常不负责的行为,跟上次apache公开的Struts2的代码执行一样的行为,会造成很多用户被黑.建议类似的厂商 ...

  8. 利用一个竞态漏洞root三星s8的方法

    作者:zjq@IceSword Lab 来源:http://www.iceswordlab.com/2018/04/20/samsung-root/ 在安卓阵营中,三星手机可以说是最重视安全的了,各种 ...

  9. 一个网站完整的SEO优化方案

    希望对SEO优化有点帮助,深咖直接跳过... 一个完整的SEO优化方案主要由四个小组组成: 前端/页编人员 内容编辑人员 推广人员 数据分析人员 接下来,我们就对这四个小组分配工作. No.1 首先, ...

最新文章

  1. android 子module混淆_Android 传统(经典)蓝牙框架
  2. linux下yum安装最新稳定版nginx
  3. Objective-C objc_class 介绍
  4. 为什么单例模式需要double check
  5. Qt 断言的使用 Q_ASSERT
  6. P1021 邮票面值设计
  7. azkaban mysql参数_azkaban参数详解
  8. java乱码base64,解决 JAVA WebSocket 解析 base64 后中文字符串乱码
  9. Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS
  10. 这个天气怎么就这么热啊,哪里还有心情写代码呀。
  11. 基于JAVA+Servlet+JSP+MYSQL的图书馆座位预约系统
  12. A股收盘:沪指收涨0.66% 深成指收涨1.01%
  13. LINUX 版本信息查看(全)
  14. php解析torrent文件格式,bittorrent 种子文件结构解析
  15. 和秋叶一起学PPT之段落排版与字体(课时四、五)
  16. 英语拼写鉴别器_CodingPark编程公园
  17. python进程间通信之管道通信
  18. 简单的有限状态机Unity独家写法(呸~厚颜无耻之人)
  19. 微信小程序春天来了 安卓程序员进入冬眠?
  20. Python爬取当当网APP数据

热门文章

  1. csu1356 :判断一个环是否为奇数环
  2. Spring学习手册番外:context:annotation-config/ 和 mvc:annotation-driven / 的区别
  3. CentOS6软件包管理
  4. 了解 NoSQL 的必读资料
  5. 关于ASP.NET MVC的一些工作中遇到的问题
  6. 危害企业IT系统最严重的五个安全威胁
  7. excel 如何快速实现绝对引用
  8. jQuery 的 slideUp 和 slideDown 下拉卷动问题
  9. Unity手游:自动寻路Navmesh 跳跃 攀爬 斜坡
  10. 下一代防火墙NGFW解读