一次惨痛的经历
来源:互联网 发布:mysql查看当前时间命令 编辑:程序博客网 时间:2024/04/29 17:45
setTimeout的原理及在JavaScript线程执行队列中的位置 开发中经常使用setTimeout进行一些延迟操作。昨天突然想了解下setTimeout的handler到底在队列中的什么位置特别好奇。今天特地来测试下。定义和用法setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。语法setTimeout(code,millisec)参数描述code 必需。要调用的函数后要执行的 JavaScript 代码串。 millisec 必需。在执行代码前需等待的毫秒数。 提示和注释提示:setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。以上定义来源于w3school.comJavaScirpt线程先了解下浏览器,浏览器是多线程的。1.JavaScript引擎线程2.界面渲染线程3.浏览器事件触发线程4.Http请求线程JS运行在浏览器中,是单线程的,每个window一个JS引擎线程。既然是单线程的,的在某个特定的时刻只有特定代码能被执够行,并阻塞其它的代码。(至于ajax的实现这里就不说了。)原理 来了解下setTimeout的简单的原理:setTimeout调用的时候,JavaScript引擎会启动定时器timer,大约millisec(ms)以后执行code,当定时器时间到,就把该事件放到主事件队列等待处理。注意:浏览器JavaScript线程空闲的时候才会真正执行为什么呢?因为当JavaScript线程的正在出来其他JavaScript代码时,其实以已经阻塞了其他的代码,其中包括的setTimeout的定时器部分的实现。代码测试复制代码<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script type="text/javascript"> function testHandler() { console.log("调用了setTimeout的函数"); } window.onload = function () { console.log("开始"); console.log("设置setTimeout 100ms"); setTimeout(testHandler,100); console.log("休眠1000ms"); sleep(1000); testNext(); console.log("结束"); } function testNext() { console.log("后续执行的函数"); } function sleep(number) { var now = new Date(); var exitTime = now.getTime() + number; while (true) { now = new Date(); if (now.getTime() > exitTime) return; } } </script></head><body></body></html>复制代码最终浏览器输出的结果:此处setTimeout其实只延迟了100ms。而进setTimeout到结束中先模拟休眠了2000ms,然后再执行了testNext函数。但是从测试结果来看实际上testHandler却是在整个队列的最后。这就解释了上诉中说的,setTimeout将code加入到队列的操作必须是在线程空闲的时候才会执行了。millisec参数有什么用?上诉测试发现,实际应用中。setTimeout的millisec参数不管你设置多少,实际执行都是在线程的最后,因为在执行一个操作的时候,JavaScript肯定是一直把代码执行完后再走setTimeout绑定的code的。那么问题来了。setTimeout(handler,0)和setTimeout(handler,100)在单独使用时,好像并没有区别。(中间执行的代码处理时间超过100ms时)复制代码 <script type="text/javascript"> function testHandler() { console.log("调用了setTimeout的函数"); } window.onload = function () { console.log("开始"); console.log("设置setTimeout 100ms"); setTimeout(testHandler,100); setTimeout(function () { console.log("调用了setTimeout的函数2"); }, 50); console.log("休眠1000ms"); sleep(1000); testNext(); console.log("结束"); } function testNext() { console.log("后续执行的函数"); } function sleep(number) { var now = new Date(); var exitTime = now.getTime() + number; while (true) { now = new Date(); if (now.getTime() > exitTime) return; } } </script>复制代码输出结果:个人认为millisec一般在多个setTimeout一起使用的时,需要区分哪个先加入到队列的时候才有用,否则都可以设置成setTimeout(handler,0)(异步操作不在讨论范围内)以上哪有写的不对的地方欢迎指正学习。^3^欢迎转载
js数组依据下标删除元素 (2012-12-28 17:34:09)转载▼标签: it 分类: 日常学习一直在使用js相关的东西,但很少作总结,今天遇到操作js数组的一些问题,对js的数组有了更进一步的认识!1、创建数组var array = new Array();var array = new Array(size);//指定数组的长度var array = new Array(item1,item2……itemN);//创建数组并赋值2、取值、赋值var item = array[index];//获取指定元素的值array[index] = value;//为指定元素赋值3、添加新元素array.push(item1,item2……itemN);//将一个或多个元素加入数组,返回新数组的长度array.unshift(item1,item2……itemN);//将一个或多个元素加入到数组的开始位置,原有元素位置自动后移,返回 新数组的长度array.splice(start,delCount,item1,item2……itemN);//从start的位置开始向后删除delCount个元素,然后从start的位置开始插入一个或多个新元素4、删除元素array.pop();//删除最后一个元素,并返回该元素array.shift();//删除第一个元素,数组元素位置自动前移,返回被删除的元素array.splice(start,delCount);//从start的位置开始向后删除delCount个元素5、数组的合并、截取array.slice(start,end);//以数组的形式返回数组的一部分,注意不包括 end 对应的元素,如果省略 end 将复制 start 之后的所有元素array.concat(array1,array2);//将多个数组拼接成一个数组6、数组的排序array.reverse();//数组反转array.sort();//数组排序,返回数组地址7、数组转字符串array.join(separator);//将数组原因用separator连接起来列了这么都就是没有发现删除数组元素的方法!于是查了一些资料找到了解决方法。删除数组元素需要扩展Array原型prototype.Array.prototype.del=function(index){ if(isNaN(index)||index>=this.length){ return false; } for(var i=0,n=0;i if(this[i]!=this[index]){ this[n++]=this[i]; } } this.length-=1; };
将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片:data格式的Url最直接的好处是,这些Url原本会引起一个新的网络访问,因为那里是一个网页的地址,现在不会有新的网络访问了,因为现在这里是网页的内容。这样做,会减少服务器的负载,当然同时也增加了当前网页的大小。所以对“小”数据特别有好处。 另外听说这种方式可以将一些敏感的图片放进网页中
获取整数的长度可以用以下几种方法实现:1.调用toString方法转为字符串后取长度var num = 123;alert(num.toString().length);2.隐式转字符串后取长度var num = 123;alert((num + '').length)推荐第1种方法,简单高效js 获取页面中所有的checkboxvar inputs = document.getElementsByTagName("input");//获取所有的input标签对象var checkboxArray = [];//初始化空数组,用来存放checkbox对象。for(var i=0;i<inputs.length;i++){ var obj = inputs[i]; if(obj.type=='checkbox'){ checkboxArray.push(obj); }}所有的checkbox对象都存在checkboxArray这个数组里了。 JS倒序输出字符串<html> <head><title>JS倒序输出字符串</title><script> function Show(){ var str="ABCDE"; var strShow=""; document.write(str+"<br>"); for(var i=str.length-1; i>=0; i--) { strShow+=str.substring(i,i+1); alert(strShow); } document.write("<font color=red>"+strShow+"</font>"); }</script></head><body><SCRIPT LANGUAGE="JavaScript">Show();</SCRIPT></body></html>如何判断传过来的JSON数据中,某个字段是否存在 1.obj["key"] != undefined 这种有缺陷,如果这个key定义了,并且就是很2的赋值为undefined,那么这句就会出问题了。 2.!("key" in obj) 3.obj.hasOwnProperty("key") 这两种方法就比较好了,推荐使用。 JavaScript模拟的IP输入框<body><script ID="clientEventHandlersJS" LANGUAGE="javascript"><!--function T1_onkeyup() { if(document.card.T1.value.length==3){ document.card.T2.focus(); }} function T2_onkeyup() { if(document.card.T2.value.length==3){ document.card.T3.focus(); }}function T3_onkeyup() { if(document.card.T3.value.length==3){ document.card.T4.focus(); }}//--></script><form method="POST" name="card" action>输入IP:<input type="text" name="T1" size="4" maxlength="4" LANGUAGE="javascript" onkeyup="return T1_onkeyup()">.<input type="text" name="T2" size="4" maxlength="4" LANGUAGE="javascript" onkeyup="return T2_onkeyup()">.<input type="text" name="T3" size="4" maxlength="4" LANGUAGE="javascript" onkeyup="return T3_onkeyup()">.<input type="text" name="T4" size="4" maxlength="4"></form> </body>
we are cloud –>We Are Cloud
<!doctype html><html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <script type="text/javascript"> //1.toLocaleUpperCase //将字符串中所有的字母字符都将被转换为大写的,同时适应宿主环境的当前区域设置。 //2.toUpperCase //将字符串中的所有字母都被转化为大写字母。 //3.toLocaleLowerCase //将字符串所有的字母字符都被转换为小写,同时考虑到宿主环境的当前区域设置。 //4.toLowerCase //将字符串中的字母被转换为小写字母。// string.substr(start,length)// start 必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。// length 可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 stringObject 的开始位置到结尾的字串。 var str = "we are cloud"; document.writeln('原字符串' + str + '<br />'); document.writeln('字母字符都被转换为大写' + str.toLocaleUpperCase() + '<br />'); document.writeln('字母字符都被转换为小写' + str.toLocaleLowerCase() + '<br />'); var _str = str.split(' '); var b = ''; for (var i = 0; i < _str.length; i++) { b += _str[i].substr(0, 1).toUpperCase() + _str[i].substr(1) + " "; } document.writeln(b); //We Are Cloud </script> </head> <body> </body></html>
0 0
- 一次惨痛的经历
- 用DELL的一次DEBUG惨痛经历(两天啊)
- 缅怀一次惨痛的网易有道面试经历
- 惨痛的学车经历
- 几次惨痛的面试经历
- 历经5年,一次业余网页游戏项目惨痛的失败经历
- memcpy与strcpy(strncpy)的惨痛经历
- LINUX下安装QT的惨痛经历
- LINUX下安装QT的惨痛经历
- 悲剧!中小企业惨痛的外训经历!
- 悲剧!中小企业惨痛的外训经历!
- 360校招失败的惨痛经历
- 360校招失败的惨痛经历
- 在北京创业三个月的惨痛经历
- DSP连接仿真器的惨痛经历
- 记录一次惨痛的升级glibc 教训
- “惨痛”的一次面试之旅
- 惨痛经历换来的防骗秘籍
- 解决各大乱码问题
- S7协议
- 将6个字符串存入vector容器中,并采用一种STL算法排序并输出
- CF 136A present
- POJ 2524 Ubiquitous Religions【并查集模板】
- 一次惨痛的经历
- asp.net mvc 特性路由(MapMvcAttributeRoutes)的应用
- Eclipse插件添加git进行工程的上传与下载
- Android应用程序的debug属性
- MPI编程及性能优化
- IDEA - Tomcat 配置虚拟目录用来存放图片和访问图片
- 教程:欢迎使用CSDN-markdown编辑器
- ajax实现表单的提交
- 完全新手: windows64 bit 安装python2.7.11 和 scikit-learn