(2)Object.freeze冻结对象
这个是不克不及改属性值,如下图所示:
(3)defineProperty冻结单个属性
如下图所示,设置enumable/writable为false,那么这个属性将弗成遍历和写:
6. 准时器
怎么实现一个JS版的sleep函数?因为在C/C++/Java等说话是有sleep函数,然则JS没有。sleep函数的感化是让线程进入休眠,当到了指准时光后再从新唤起。你不克不及写个while轮回然后赓续地断定当前时光和开端时光的差值是不是到了指准时光了,因为如许会占用CPU,就不是休眠了。
这个实现比较简单,我们可以应用setTimeout + 回调:
- function sleep(millionSeconds, callback) {
- setTimeout(callback, millionSeconds);
- }
- // sleep 2秒
- sleep(2000, () => console.log("sleep recover"));
然则应用回调让我的代码不克不及够和平常的代码一样像瀑布流一样写下来,我得搞一个回调函数算作参数传值。于是想到了Promise,如今用Promise改写一下:
但似乎照样没有办法解决膳绫擎的问题,仍然须要传递一个函数参数。
固然应用Promise本质上是一样的,然则它有一个resolve的参数,便利你告诉它什么时刻异步停止,然后它就可以履行then了,特别是在回调比较复杂的时刻,应用Promise照样会加倍的便利。
ES7新增了两个新的属性async/await用于处理的异步的情况,让异步代码的写法就像同步代码一样,如下async版本的sleep:
- function sleep(millionSeconds) {
- return new Promise(resolve =>
- setTimeout(resolve, millionSeconds));
- }
- async function init() {
- await sleep(2000);
- console.log("sleep recover");
- }
- init();
- init().then(() => console.log("init finished"));
ES7的新属性让我们的代码加倍地简洁优雅。
此次返回了true,然后再变换一下其它的断定,如上图,最后可以知道根来源基本因是上图最后一个断定:
关于准时器还有一个很重要的话题,那就是setTimeout和setInterval的差别。如下图所示:
—所以经由过程撙节,把履行次数降到了1s履行10次,撙节时光也可以控制,但同时掉去了灵敏度,如不雅你须要高灵敏度就不该该应用撙节,例如做一个拖拽的应用。如不雅拖拽撙节了会怎么样?用户会发明拖起来一卡一卡的。
有时刻须要在代率攀琅绫擎做一些兼容性断定,或者是做一些UA的断定,如下代码所示:
setTimeout是在当前履行单位都履行完才开端计时,而setInterval是在设定完急鹞鲼后就立马计时。可以用一个实际的例子做解释,这个例子我在《JS与多线程》这篇文┞仿琅绫擎提到过,这里用代码实际地运行一下,如下代码所示:
- let scriptBegin = Date.now();
推荐阅读
本篇是看的《JS高等法度榜样设计》第23章《高等技能》做的读书分享。本篇按照书里的思路根据本身的懂得和经验,进行扩大延长,同时指出版里的一些问题。将会评论辩论安然的类型检测、惰性>>>详细阅读
本文标题:JavaScript高级程序设计高级技巧
地址:http://www.17bianji.com/lsqh/37134.html
1/2 1