html整⼈js代码⼤全,这⼏⾏javascript代码能让你的浏览器崩
溃?
这⼏⾏ javascript 代码能让你的浏览器崩溃?
(温馨提⽰:访问前请保存电脑/⼿机正在编辑的任务,整⼈被打概不负责嘿嘿~)
事情还是得从⼀篇推⽂说起——2⽉17⽇, IT Security Tweets ™ 发了⼏⾏JavaScript代码,说是能让你的浏览器崩溃以及iPhone重启:
什么东西这么神奇
于是打开电脑跃跃欲试,当满怀好奇地在浏览器上执⾏了这段代码后发现: Chrome ⽴马陷⼊了卡死的状态,点击关闭窗⼝没响应!!
打开任务管理器,发现CPU已飙升⾄100%:
在任务管理器⾥结束 Chrome 进程,所幸⼀切恢复正常。
不过也纳闷着,这⼏⾏代码究竟⼜是什么梗??
var total = "";
for (var i = 0; i < 1000000; i++) {
total = total + i.toString();
javascript经典代码大全history.pushState(0, 0, total);
}
从代码看应该是history对象的pushState()⽅法在1000000次的循环中耗尽了系统的资源。看了⼀下相关的博客介绍,才发现原来pushState()是HTML5引进的新特性之⼀,它的引进与Ajax有着密切的关系。
我们知道,Ajax的出现⽅便了⽤户浏览⽹页,它允许⽤户在不⽤刷新的情况下更新⽹站的内容,但是这样也引发了⼀个问题,就是更新⽹站内容之后,不同的页⾯之间还是有区别的,⽽这种区别⽆法体
现在URL上:Ajax产⽣的页⾯变化并没有伴随着URL的改变,当前页的URL 仍与前⼀页的URL⼀样,这就导致我们⽆法通过前进、后退来切换页⾯。在传统的浏览体验中,页⾯内容的改变往往会伴随着URL的改变,⽽这些改变对应着“前进”和“后退”,但是Ajax的出现破坏了这种独特的体验。为此,HTML5 给history对象新增了⼀些特性来解决这个问题,其中就包括上⾯代码⾥的pushState()⽅法。
根据W3C的HTML5⽂档,pushState()⽅法的作⽤是在浏览器的历史记录栈⾥⾯添加记录(Pushes the given data onto the session history),该⽅法包含三个参数:⼀个事件对象,⼀个加进历史记录的页⾯的标题(通常被浏览器忽略),⼀个加进历史记录的地址。这样⼀来,当Aja作做变更⼀次,就可以⽤pushState()⽅法添加⼀次历史记录,在此基础上再加上其它⼏个⽅法,便使得我们可以主动地对历史记录进⾏编辑,⽆刷新改变URL,从⽽弥补了使⽤Ajax带来的这个缺陷。
回到代码,for做了1000000次循环,浏览器的历史记录(压⼊URL)也就修改了1000000次,并且,每次循环的URL都在上⼀次的基础叠加,这样不断循环下去向history添加记录,迅速地消耗系统内存资源,从⽽导致浏览器的崩溃。
了解缘由后,选了⼏个⼿机设备做了测试,虽然没有出现twitter所说的能让iPhone设备重启的现象,但是都不约⽽同地搞挂了浏览器。
有了这段代码后,似乎⼜多了个整蛊⼩伙伴的新姿势嘿嘿~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。