JS的延迟加载有助与提升页面的加载速度。
defer和async、动态建立DOM方式(用得最多)、按需异步载入JS
defer:延迟脚本。当即下载,但延迟执行(延迟到整个页面都解析完毕后再运行),按照脚本出现的前后顺序执行。
async:异步脚本。下载完当即执行,但不保证按照脚本出现的前后顺序执行。php
同步的概念在操做系统中:不一样进程协同完成某项工做而前后次序调整(经过阻塞、唤醒等方式),同步强调的是顺序性,谁先谁后。异步不存在顺序性。
同步:浏览器访问服务器,用户看到页面刷新,从新发请求,等请求完,页面刷新,新内容出现,用户看到新内容以后进行下一步操做。
异步:浏览器访问服务器请求,用户正常操做,浏览器在后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。css
若请求的资源编码,如外引js文件编码与页面编码不一样。可根据外引资源编码方式定义为 charset="utf-8"或"gbk"。
好比:http://www.yyy.com/a.html 中嵌入了一个http://www.xxx.com/test.js
a.html 的编码是gbk或gb2312的。 而引入的js编码为utf-8的 ,那就须要在引入的时候
<script src="http://www.xxx.com/test.js&quot; charset="utf-8"></script>html
全局变量、闭包、DOM清空或删除时,事件未清除、子元素存在引用前端
Flash提供了ExternalInterface接口与JavaScript通讯,ExternalInterface有两个方法,call和addCallback,call的做用是让Flash调用js里的方法,addCallback是用来注册flash函数让js调用。node
Flash:适合处理多媒体、矢量图形、访问机器。但对css、处理文本不足,不容易被搜索。
Ajax:对css、文本支持很好,但对多媒体、矢量图形、访问机器不足。web
1) 数据体积方面。JSON相对于XML来说,数据的体积小,传递的速度更快些。
2) 数据交互方面。JSON与JavaScript的交互更加方便,更容易解析处理,更好的数据交互。
3) 数据描述方面。JSON对数据的描述性比XML较差。
4) 传输速度方面。JSON的速度要远远快于XML。面试
web socket:在一个单独的持久链接上提供全双工、双向的通讯。使用自定义的协议(ws://、wss://),同源策略对web socket不适用。
web worker:运行在后台的JavaScript,不影响页面的性能。
建立worker:var worker = new Worker(url);
向worker发送数据:worker.postMessage(data);
接收worker返回的数据:worker.onmessage
终止一个worker的执行:worker.terminate();ajax
1) 标记清除:
这个算法把“对象是否再也不须要”简化定义为“对象是否能够得到”。
这个算法假定设置一个叫作根(root)的对象(在Javascript里,根是全局对象)。按期的,垃圾回收器将从根开始,找全部从根开始引用的对象,而后找这些对象引用的对象。从根开始,垃圾回收器将找到全部能够得到的对象和全部不能得到的对象。正则表达式
2) 引用计数:
这是最简单的垃圾收集算法。此算法把“对象是否再也不须要”简化定义为“对象有没有其余对象引用到它”。若是没有引用指向该对象(零引用),对象将被垃圾回收机制回收。
该算法有个限制:没法处理循环引用。两个对象被建立,并互相引用,造成了一个循环。它们被调用以后不会离开函数做用域,因此它们已经没有用了,能够被回收了。然而,引用计数算法考虑到它们互相都有至少一次引用,因此它们不会被回收。
前端面试查漏补缺--(二) 垃圾回收机制算法
JavaScript数据推送:commet(基于http长链接的服务器推送技术)。
基于web socket的推送:SSE(server-send Event)
1) 将cookie的失效时间设置为过去的时间(expires)
document.cookie = ‘user=’+ encodeURIComponent(‘name’) + '; expires=’+ new Date(0);
2) 将系统时间设置为当前时间往前一点时间
var data = new Date(); date.setDate(date.getDate()-1);
1.经过实例化一个XMLHttpRequest对象获得一个实例,调用实例的open方法为此次 ajax请求设定相应的http方法、相应的地址和以及是否异步,固然大多数状况下咱们都是选异步, 以异步为例,以后调用send方法ajax请求,这个方法能够设定须要发送的报文主体,而后经过 监听readystatechange事件,经过这个实例的readyState属性来判断这个ajax请求的状态,其中分为0,1,2,3,4这四种 状态,当状态为4的时候也就是接收数据完成的时候,这时候能够经过实例的status属性判断这个请求是否成功
var xhr = new XMLHttpRequest(); xhr.open('get', 'aabb.php', true); xhr.send(null); xhr.onreadystatechange = function() { if(xhr.readyState==4) { if(xhr.status==200) { console.log(xhr.responseText); } } }
Ajax请求的页面历史记录状态问题?
Ajax的优点
Ajax局限性
attribute是dom元素在文档中做为html标签拥有的属性
property是dom元素在js中做为对象拥有的属性。
因此,对于html的标准属性来讲,attribute和property是同步的,是会自动更新的。但对于自定义属性,他们不一样步。
事件代理就是说咱们将事件添加到原本要添加事件的父节点,将事件委托给父节点来触发处理函数,这一般会在 这一般会使用在大量的同级元素须要添加同一类事件的时候,好比一个动态的很是多的列表,须要为每一个列表项都添加 点击事件,这时可使用事件代理,经过判断e.target.nodeName来判断发生的具体元素,从而判断是不是在 列表项中触发,这样的好处是能够减小事件绑定,同时动态的DOM结构仍然能够监听。事件代理发生在冒泡阶段。
参考:
浅析JavaScript的事件代理和委托
1.DOM事件包含捕获(capture)和冒泡(bubble)两个阶段:捕获阶段事件从window开始触发事件而后经过祖先节点一次传递到触发事件的DOM元素上;冒泡阶段事件从初始元素依次向祖先节点传递直到window
2.标准事件监听elem.addEventListener(type, handler, capture)/elem.removeEventListener(type, handler, capture):handler接收保存事件信息的event对象做为参数,event.target为触发事件的对象,handler调用上下文this为绑定监听器的对象,event.preventDefault()取消事件默认行为,event.stopPropagation()/event.stopImmediatePropagation()取消事件传递
3.老版本IE事件监听elem.attachEvent('on'+type, handler)/elem.detachEvent('on'+type, handler):handler不接收event做为参数,事件信息保存在window.event中,触发事件的对象为event.srcElement,handler执行上下文this为window使用闭包中调用handler.call(elem, event)可模仿标准模型,而后返回闭包,保证了监听器的移除。event.returnValue为false时取消事件默认行为,event.cancleBubble为true时取消时间传播
4.一般利用事件冒泡机制托管事件处理程序提升程序性能。
/** * 跨浏览器事件处理工具。只支持冒泡。不支持捕获 * @author (qiu_deqing@126.com) */ var EventUtil = { getEvent: function (event) { return event || window.event; }, getTarget: function (event) { return event.target || event.srcElement; }, // 返回注册成功的监听器,IE中须要使用返回值来移除监听器 on: function (elem, type, handler) { if (elem.addEventListener) { elem.addEventListener(type, handler, false); return handler; } else if (elem.attachEvent) { var wrapper = function () { var event = window.event; event.target = event.srcElement; handler.call(elem, event); }; elem.attachEvent('on' + type, wrapper); return wrapper; } }, off: function (elem, type, handler) { if (elem.removeEventListener) { elem.removeEventListener(type, handler, false); } else if (elem.detachEvent) { elem.detachEvent('on' + type, handler); } }, preventDefault: function (event) { if (event.preventDefault) { event.preventDefault(); } else if ('returnValue' in event) { event.returnValue = false; } }, stopPropagation: function (event) { if (event.stopPropagation) { event.stopPropagation(); } else if ('cancelBubble' in event) { event.cancelBubble = true; } }, /** * keypress事件跨浏览器获取输入字符 * 某些浏览器在一些特殊键上也触发keypress,此时返回null **/ getChar: function (event) { if (event.which == null) { return String.fromCharCode(event.keyCode); // IE } else if (event.which != 0 && event.charCode != 0) { return String.fromCharCode(event.which); // the rest } else { return null; // special key } } };
/^[a-zA-Z]w+$/