发表于: 2017-04-27 22:07:45
2 1018
今天完成的事情:
昨天学了为了防止内存泄漏,可以用闭包的方式解决,那么为什么内存会泄露呢?
这就涉及到了浏览器的垃圾回收机制(作为基础知识补充了解一下原理):
垃圾收集器必须跟踪哪个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存,内存泄露和浏览器实现的垃圾回收机制息息相关,而浏览器实现标识无用变量的策略主要有下两个方法:
第一,引用计数法
跟踪记录每个值被引用的次数。当声明一个变量并将引用类型的值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次 数加1.相反,如果包含对这个值引用的变量又取得另外一个值,则这个值的引用次数减1.当这个值的引用次数变成0时,则说明没有办法访问这个值了,因此就 可以将其占用的内存空间回收回来。
如: var a = {}; //对象{}的引用计数为1
b = a; //对象{}的引用计数为 1+1
a = null; //对象{}的引用计数为2-1
所以这时对象{}不会被回收;
IE 6, 7 对DOM对象进行引用计数回收, 这样简单的垃圾回收机制,非常容易出现循环引用问题导致内存不能被回收, 进行导致内存泄露等问题,一般不用引用计数法。
第二,标记清除法
到2008年为止,IE,Firefox,Opera,Chrome和Safari的javascript实现使用的都是标记清除式的垃圾收集策略(或类似的策略),只不过垃圾收集的时间间隔互有不同。
标记清除的算法分为两个阶段,标记(mark)和清除(sweep). 第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。
任务五要求跨域,就先看了看跨域的相关,跨域的几种方式:
jsonp(利用script标签的跨域能力)跨域
websocket(html5的新特性,是一种新协议)跨域
设置代理服务器(由服务器替我们向不同源的服务器请求数据)
CORS(跨源资源共享,cross origin resource sharing
iframe跨域(据说这个有好多的缺点,还没看到,不建议使用)
postMessage(包含iframe的页面向iframe传递消息)
关于前端模块化:
前端模块话就是把复杂的文件分成一个个独立的模块,比如js文件,分成独立的模块之后有利于代码的重用和维护,但是这样又会引来模块与模块之间的依赖问题,所以就有了CommonJS、AMD、CMD规范,最后出现了webpack,webpack就是前端模块话的一种解决方案,基本上大公司都会使用webpack,关于webpack可以百度一下,是一种模块加载器兼打包工具,很好用,而且已经普及到了github上各大主流的(react相关)项目。
它具有以下优势:
1. webpack 是以 commonJS 的形式来书写脚本滴,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。
2. 能被模块化的不仅仅是 JS 了。
3. 开发便捷,能替代部分 grunt/gulp 的工作,比如打包、压缩混淆、图片转base64等。
4. 扩展性强,插件机制完善,特别是支持 React 热插拔。
关于如何进行前端优化,提高页面的加载速度:
1、使用css sprites,可以有效的减少http请求数
2、使用缓存
3、压缩js,css文件,减小文件体积
4、使用cdn,减小服务器负担
5、懒加载图片
6、预加载css,js文件
7、避免dom结构的深层次嵌套
8、给DOM元素添加样式时,把样式放到类中,直接给元素添加类,减少重构,回流
大概整理一下游戏的业务逻辑:
1.乱序排出杀手和平民的位置,存储在sessionstorage
2.跳转页面,获取身份信息单独展示,然后在法官页面集中展示
3.为相应的身份添加生死状态并定义选中状态
4.确定杀人时判定被选中者身份,是平民则执行改变状态操作,是杀手则返回false并弹窗
5.投票阶段跳过判定身份(谁都可以杀)
6.以一个完整的流程作为一天结束的标志(按顺序执行,杀人始,投票环节终)
7.每次一个完整的流程结束后记录所有玩家状态并保存,创建法官查看页面,可以显示至上回合结束时所有玩家状态
8.每次投票环节结束时判定杀手数是否为零(平民胜利)和平民数是否小于杀手数(杀手胜利)
明天要做的事:
收尾任务四,进入任务五,写静态页面,搞清楚任务五逻辑,进行基础知识学习
遇到的问题:
暂无。
收获:
POWER UP!
与各位师兄弟交流了一下,拓展了思路,果然每个人完成任务的逻辑都是不一样的,写出来的代码也都体现出各自对任务的理解,看问题的角度得到了很大拓宽。
小师弟的清除浮动办法讲得不错,有一些我都忘了,学习了。
评论