上个周日,介绍了如何使用setTimeout代替setInterval进行间歇调用,这个周日,继续来讲<JavaScript高级程序设计>这本书里面,对于setTimeout的另一种妙用--防止循环超时 [这是铺垫,为故事的高潮埋下伏笔] JS是单线程的,一个代码块里面的代码,只能按顺序从上到下执行,所以如果中间有一块代码,执行起来非常耗时,就会导致下面的代码无法执行,出现浏览器假死的状态. JS的耗时操作,常见的有两种  1.向服务器发起请求   2.对数组的循环操作  (当然,还有一种,就…
前端开发:setTimeout与setInterval 定时器与异步循环数组 前言: 开通博客园三个月以来,随笔记录了工作中遇到的大大小小的难题,也看过无数篇令人启发的文章,我觉得这样的环境是极好的,在与博友的分享中可以学到新的知识.得到先驱者的指正.解决工作中遇到的难题.近一个月工作繁忙,新的文章也迟迟未写,今天呢,过来深入了解一下 关于javascript定时器的知识: setTimeout与setInterval简述 setTimeout与setInterval使用方法基本相同,他们接受两…
定义 在指定的延迟时间之后调用一个函数或执行一个代码片段 这个是setTimeout最主要的功能,但也是很坑的地方,首先javascript其实是运行在单线程的环境下,意味者定时器会在未来的某个时间支持,但是具体的执行的时间并不能够很准确的运行,容易受到其它时间的影响,比如DOM的计算.事件的执行.各种函数的执行和运算.但是我们可以利用延迟执行的一些特性来达到我们想要的功能.. window.setTimeout(callbask, delay, [param1, param2, ...]) 函…
最近在某团队忙于一个项目,有这么一个页面,采用传统模式开发(吐槽它为什么不用React),它的DOM操作比较多,然后性能是比较差的,尤其当你缩放窗口时,可怕的事情发生了,出现了卡顿,甚至浏览器瘫痪.为什么呢? 由于该页面的DOM操作非常多,故窗口缩放每一帧时都会触发函数的执行,连续的重新DOM操作,这样对浏览器的开销是非常大的.既然在窗口缩放时,会让浏览器重新计算DOM,那么我们为什么不可以让DOM的计算延时呢,让窗口停止缩放后才重新计,这样不就节省了浏览器的开销,达到优化的效果了吗? 知识准备…
//第一种,使用while循环 function sleep(delay) { var start = (new Date()).getTime(); while((new Date()).getTime() - start < delay) { continue; } } //或者使用for循环 function sleep(delay) { for(var t = Date.now(); Date.now() - t <= d;); } 这种实现方式是利用一个伪死循环阻塞主线程.因为JS是…
在For循环中执行setTimeOut()方法的代码,执行顺序是怎样的呢? 代码如下 function time() { for(var i= 0;i<5;i++){ setTimeout(function () { console.log(i); },1000) } } time(); 应该会有人会说,很简单呀,for循环进行遍历,并且每次有一个输出,那结果应该是0,1,2,3,4. 其实不然,运行上诉代码之后,控制台输出如下:5个5 下面解释下为什么是5个5. 首先关于最开始贴的代码,我们是…
根据HTML 5标准,setTimeout推迟执行的时间,最少是5毫秒.如果小于这个值,会被自动增加到5ms. 每一个setTimeout在执行时,会返回一个唯一ID,把该ID保存在一个变量中,并传入clearTimeout,可以清除定时器. 在setTimeout内部,this绑定采用默认绑定规则,也就是说,在非严格模式下,this会指向window:而在严格模式下,this指向undefined. setTimeout不止有2个参数,第一个参数是回调函数,第二个参数是时间,第三个参数以后都是…
我们都知道,alert这种内置弹框会阻塞后续代码执行: 之所以如此,就是因为JavaScript代码在浏览器中是单线程执行的.换句话说,浏览器中只有一个主线程负责运行所有JavaScript代码(不考虑Web Worker). 提到浏览器中的JavaScript,基本上只有三个来源: BOM API的代码,让我们可以操作并利用浏览器提供的能力 DOM API的代码,让我们可以操作网页内容 我们自己写的ECMAScript代码 这没什么.我们也知道,setTimeout用于“定时”执行代码,比如这…
我们在日常web前端开发中,经常需要用到定时器方法. 前端中的定时器方法是浏览器提供的,并不是ECMAScript规范中的.是window对象的方法. 浏览器中的定时器有两种, 一种是每间隔一定时间执行一次,循环往复.比如每隔一秒执行一次,六十秒过后执行了60次. 一种是过了一定时间执行一次,只执行一次.比如隔一秒后执行一次,过了十万八千秒后也只在第一秒执行了一次,仅有的一次. 第一种是:window.setInterval 第二种是:window.setTimeout 由于window在浏览器…
说到setTimeout写过javascript的伙伴们一定不会陌生,去银行办过存取款业务的伙伴一定对取号机不会陌生.今天群里有个好伙伴在问setTimeout的问题,大伙你一言我一语,讲了很多,可是她听了之后还是不理解.我先不说她的问题,请先回忆一下,去银行或医院排队的时候,是不是要先去机器上取一个号码呀.也不知从几何时,取号机就开始流行起来了.不过这也确实是好事,不用一直站在那里排呀排,而且可以知道前面有多少人排在我前面,因此大可以放心的坐在椅子上刷微博,玩微信.等到叫你手中的号码时,就轮到…
setTimeout("alert('久等了')",2000)是等待多长时间开始执行函数 setinterval(fn,1000)是每隔多长时间执行一次函数 setTimeout和setinterval都可以实现循环调用函数,但setTimeout必须放在函数内实现自调用,而setinterval则必须放在函数外…
Js阻塞机制,跟Js引擎的单线程处理方式有关,每个window一个JS线程.所谓单线程,在某个特定的时刻只有特定的代码能够被执行,并阻塞其它的代码. 由于浏览器是事件驱动的(Event driven),因此浏览器中很多行为是异步(Asynchronized)的,很容易有事件被同时或者连续触发.当异步事件发生时,会创建事件并放入执 行队列中,等待当前代码执行完成之后再执行这些代码,如鼠标点击事件发生.定时器触发事件发生.XMLHttpRequest完成回调这些事件,都会被放 入执行队列中等待. 关…
1.开胃菜,setTimeout为何物 首先看一下w3school上面对于setTimeout的解释 setTimeout(fn,millisec) 方法用于在指定的毫秒数后调用函数或计算表达式. 很简单,setTimeout() 只执行 fn 一次,到底什么时候执行取决于第二个参数millisec设定的毫秒数,所以很多人习惯上称之为延迟,无非就是延迟一段时间后再执行里面的代码. setTimeout(function(){ console.log('我是setTimeout'); }, 100…
setInterval()和setTimeout()方法都是js原生的定时方法,当然它们两个的作用也是不同的,并且最近在做上下滚动公告栏的时候,发现了setInterval()非常令人抓狂的问题,那就是用setInterval()做的定时滚动会随着浏览器页面切换变得无法控制!为什么会说无法控制呢,因为在切换页面一段时间之后,我本设置3秒滚动一次变成了一秒一次,滚动变得越来越快了.对于这个问题我花了一个上午得时间去解决.下面我们先了解一下setInterval()和setTimeout()方法的区…
在管理 setTimeout & setInterval 这两个 APIs 时,笔者通常会在顶级(全局)作用域创建一个叫 timer 的对象,在它下面有两个数组成员 —— {sto, siv},用它们来分别存储需要管理的 setTimeoutID / setIntervalID.如下: var timer = { sto: [], siv: [] }; 在使用 setTimeout / setInterval 的时候,这样调用: // 标记 setTimeoutID timer.sto.push…
1.基本使用 Fetch 是一个新的端获取资源的接口,用于替换笨重繁琐XMLHttpRequest.它有了Request 和 Response 以及Headers对象的概念,与后端语言请求资源更接近. 一个简单的GET请求 fetch('https://www.baidu.com') .then(resp=>resp.text()) // 转换成文本对象 .then(resp=>console.log(resp)) // 输出请求内容 .catch(error => console.er…
从一道题浅说 JavaScript 的事件循环 原文链接: https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/7 注:本篇文章运行环境为当前最新版本的谷歌浏览器(72.0.3626.109) 任务队列 首先我们需要明白以下几件事情: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件. 一旦执…
原文链接:https://www.cnblogs.com/yfrs/p/fetch.html 1.基本使用 Fetch 是一个新的端获取资源的接口,用于替换笨重繁琐XMLHttpRequest.它有了Request 和 Response 以及Headers对象的概念,与后端语言请求资源更接近. 一个简单的GET请求 fetch('https://www.baidu.com') .then(resp=>resp.text()) // 转换成文本对象 .then(resp=>console.log…
JavaScript的学习零散而庞杂,因此很多时候我们学到了一些东西,但是却没办法感受到自己的进步,甚至过了不久,就把学到的东西给忘了.为了解决自己的这个困扰,在学习的过程中,我一直试图在寻找一条核心的线索,只要我根据这条线索,我就能够一点一点的进步. 前端基础进阶正是围绕这条线索慢慢展开,而事件循环机制(Event Loop),则是这条线索的最关键的知识点.所以,我就马不停蹄的去深入的学习了事件循环机制,并总结出了这篇文章跟大家分享. 事件循环机制从整体上的告诉了我们所写的JavaScript…
一. 立即执行函数 windows中有个name属性,name='' '' var 如果我们用var name 去声明,那就会改变windows中name的值(因为我们不是在函数作用域中声明的,所以会覆盖全局的值) 为了避免这种问题,通常我们写一个立即执行函数(可读性不高) const 同样,如果我们用const去声明,也会改变全局的name属性 我们把const声明写在大括号里面,就不会改变全局的name属性了 二. for循环 常见的for循环,console.log(i) 会输出10,wh…
下面的代码,如果队列太长会导致栈溢出,怎样解决这个问题并且依然保持循环部分: var list = readHugeList(); var nextListItem = function() { var item = list.pop(); if (item) { // process the list item... nextListItem(); } }; 通过修改nextListItem功能可以避免潜在的堆栈溢出,如下所示: var list = readHugeList(); var n…
js的for循环,return,break,continue的使用方式和解释 let funcFor = () => { for (let i = 0; i < 4; i++) { if (i == 2) { // return //这里的return,将会退出整个函数,不执行后面的语句,输出 0 1 // break // 只会跳出当前for循环,输出 0 1 999 // continue // 跳过此次循环后面的语句,输出 0 1 3 999 } console.log(i); } co…
Vert.x Core 文档手册 中英对照表 Client:客户端 Server:服务器 Primitive:基本(描述类型) Writing:编写(有些地方译为开发) Fluent:流式的 Reactor:反应器,Multi-Reactor即多反应器 Options:配置项,作为参数时候翻译成选项 Context:上下文环境 Undeploy:撤销(反部署,对应部署) Unregister:注销(反注册,对应注册) Destroyed:销毁 Handler/Handle:处理器/处理,有些特定…
设想有downloadAsync函数的一种变种,它持有一个缓存(实现为一个Dict)来避免多次下载同一个文件.在文件已经被缓存的情况下,立即调用回调函数是最优选择. var cache=new Dict(); function downloadCachingAsync(url,onsuccess,onerror){ if(cache.has(url)){ onsuccess(cache.get(url)); return; } return downloadAsync(url,function(…
SOCKET编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用打开,读写,关闭 模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) 面向连接与无连接 面向连接 无论你使用哪…
前面的话 process对象是一个全局对象,在任何地方都能访问到它,通过这个对象提供的属性和方法,使我们可以对当前运行的程序的进程进行访问和控制.本文将详细介绍process对象 概述 process是一个全局对象,即global对象的属性,可以在任何地方直接访问到它而无需引入额外模块 console.log(process === global.process);//true console.log(process); 属性 [process.argv] 包含命令行参数的数组.第一个元素会是'…
复习Javascript到Canvas的知识点,看到一个使用Canvas绘制的静态时钟例子,便想将其变成动态显示系统时间的时钟动画.另外再配上数字显示的时钟,一个小的时钟模块的诞生了!目前的界面还比较粗糙,只有简单的界面和动画效果. 演示观看地址:http://htmlpreview.github.io/?https://github.com/omocc/Demo/blob/master/%E6%97%B6%E9%92%9Fdemo/clock.html 这个时钟包括两个部分,动画圆盘时钟和数字…
一.JavaScript的简单介绍 JavaScript是一种属于网络的脚本语言(简称JS),已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果.通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. JavaScript代码常存在于HTML文档中,被scri…
1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/go: is a directory 在这可见我的GOPATH是/Users/user/go,并在该目录下生成如下作用的三个子目录: src:存放源代码(比如.go .c .h .s等) pkg:编译后生成的文件(比如.a) bin:编译后生成的可执行文件(为了方便可将此目录加入到$PATH中,本机…
IO IO input output 在内存中存在数据交换的操作都可以认为是IO操作 和终端交互 : input print 和磁盘交互 : read write 和网络交互 : recv send IO密集型程序:在程序执行过程中存在大量IO操作,而cpu运算操作较少,消耗cpu较少,运行效率较低 计算密集型程序(CUP密集型程序):在程序执行中CPU运算较多,IO操作相对较少,消耗CPU大,运行速度快 IO分类 阻塞IO 非阻塞IO IO多路复用 阻塞IO 阻塞IO是IO的默认形态,是效率较…