js

js的单线程和异步

折月煮酒 提交于 2020-02-11 06:23:18
前言 说到js的单线程(single threaded)和异步(asynchronous),很多同学不禁会想,这不是自相矛盾么?其实,单线程和异步确实不能同时成为一个语言的特性。js选择了成为单线程的语言,所以它本身不可能是异步的,但js的宿主环境(比如浏览器,Node)是多线程的,宿主环境通过某种方式(事件驱动,下文会讲)使得js具备了异步的属性。往下看,你会发现js的机制是多么的简单高效! 说说浏览器 js是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但前端的某些任务是非常耗时的,比如网络请求,定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要包括http请求线程,浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。下图说明了浏览器的主要线程。 图片来自popAnt 画得太好,忍不住引过来 ( http://blog.csdn.net/kfanning/article/details/5768776 ) 再说说任务队列 刚才说到浏览器为网络请求这样的异步任务单独开了一个线程,那么问题来了,这些异步任务完成后,主线程怎么知道呢?答案就是回调函数,整个程序是事件驱动的

require.js js模块化方案

南笙酒味 提交于 2020-02-11 05:51:54
一、为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码,相信很多人都见过。   <script src="1.js"></script>   <script src="2.js"></script>   <script src="3.js"></script>   <script src="4.js"></script>   <script src="5.js"></script>   <script src="6.js"></script> 这段代码依次加载多个js文件。 这样的写法有很大的缺点。首先,加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长;其次,由于js文件之间存在依赖关系,因此必须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难。 require.js的诞生,就是为了解决这两个问题: (1)实现js文件的异步加载,避免网页失去响应; (2)管理模块之间的依赖性,便于代码的编写和维护。 二、require.js的加载 使用require.js的第一步,是先去官方网站下载最新版本。 下载后

深入理解js——执行上下文

拈花ヽ惹草 提交于 2020-02-11 05:14:42
什么是“执行上下文”?暂且不下定义,先看一段代码: 第一句报错,a未定义,很正常。第二句、第三句输出都是undefined,说明浏览器在执行console.log(a)时,已经知道了a是undefined,但却不知道a是10(第三句中)。 在运行一段js代码之前,浏览器已经做了一些“准备工作”,其中就包括对变量的声明,而不是赋值。变量赋值是在赋值语句执行的时候进行的。可用下图模拟: 这是第一种情况。 第二种情况。 有js开发经验的朋友应该都知道,你无论在哪个位置获取this,都是有值的。至于this具体的取值情况,那就比较复杂了。与第一种情况不同的是:第一种情况只是对变量进行声明(并没有赋值),而此种情况直接给this赋值。这也是“准备工作”情况要做的事情之一。 第三种情况。 需要注意代码注释中的两个名词——“函数表达式”和“函数声明”。虽然两者都很常用,但是这两者在“准备工作”时,却是两种待遇。 在“准备工作”中, 对待函数表达式就像对待“ var a = 10 ”这样的变量一样,只是声明。而对待函数声明时,却把函数整个赋值了 。 好了,“准备工作”介绍完毕。 我们总结一下,在“准备工作”中完成了哪些工作: 变量、函数表达式——变量声明,默认赋值为undefined; this——赋值; 函数声明——赋值; 这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。

Linux 在线模拟器

徘徊边缘 提交于 2020-02-11 05:11:28
最近在学习Linux的一些命令的使用,但是很久之前装的Linux虚拟机被删掉了,又不想为了练习几个命令折腾一遍虚拟机。所以,就尝试地搜了一下,看看有没有在线的Linux模拟器可以使用,只要可以练习一下命令的使用即可。在google中用英文关键词一搜,还真有大牛弄出了一些在线的Linux模拟器,而且用起来还不错。搜集了4个,赶紧分享出来,供大家初步学习和实践Linux之用。 jslinux :: http://bellard.org/jslinux/ 一个叫Fabrice Bellard的工程师使用 JavaScript 在浏览器上模拟出了一个 Linux 系统。没有图形化界面,完全使用命令行的方式与之互动。Linux操作系统内核版本为2.6.20。具体使用过程中可以参考jslinux:的FAQ: http://bellard.org/jslinux/faq.html 和技术说明: http://bellard.org/jslinux/tech.html jslinux:控制台窗口: JS/UIX : http://www.masswerk.at/jsuix/index.html 维也纳一家叫mass:werk media environments的公司使用JavaScript 开发的免费的类UNIX的在线OS。 JS/UIX 的使用参考手册地址: http://www

Linux 在线模拟器

痞子三分冷 提交于 2020-02-11 04:41:22
作者: gisen_6 熟读唐诗三百首,不会作诗也会吟 Linux 在线模拟器 最近在学习Linux的一些命令的使用,但是很久之前装的Linux虚拟机被删掉了,又不想为了练习几个命令折腾一遍虚拟机。所以,就尝试地搜了一下,看看有没有在线的Linux模拟器可以使用,只要可以练习一下命令的使用即可。在google中用英文关键词一搜,还真有大牛弄出了一些在线的Linux模拟器,而且用起来还不错。搜集了4个,赶紧分享出来,供大家初步学习和实践Linux之用。 jslinux :: http://bellard.org/jslinux/ 一个叫Fabrice Bellard的工程师使用 JavaScript 在浏览器上模拟出了一个 Linux 系统。没有图形化界面,完全使用命令行的方式与之互动。Linux操作系统内核版本为2.6.20。具体使用过程中可以参考jslinux:的FAQ: http://bellard.org/jslinux/faq.html 和技术说明: http://bellard.org/jslinux/tech.html jslinux:控制台窗口: JS/UIX : http://www.masswerk.at/jsuix/index.html 维也纳一家叫mass:werk media environments的公司使用JavaScript

博客园增加打赏功能

喜你入骨 提交于 2020-02-11 03:52:08
1.首先准备好自己微信和支付宝收款的二维码图片,注意,图片需要修改为bmp结尾的格式,如,alipay.bmp,wechat.bmp。 2.进入自己的博客园,然后进入 管理--->文件,在这里上传自己第1步中准备好的二维码图片。 3.复制下面的js代码 1 <script> 2 window.tctipConfig = { 3 staticPrefix: "https://static.tctip.com", 4 buttonImageId: 2, 5 buttonTip: "dashang", 6 list:{ 7 alipay: { qrimg: "https://files.cnblogs.com/files/clovershell/alipay.bmp"}, 8 weixin: { qrimg: "https://files.cnblogs.com/files/clovershell/wechat.bmp"}, 9 } 10 }; 11 </script> 12 <script src="https://static.tctip.com/js/tctip.min.js"></script> 4.修改js代码第7行和第8行,如下 7 alipay: {qrimg: "http://files.cnblogs.com/files/自己的博客地址名/支付宝图片的名子.bmp"},

博客园博客添加打赏功能技巧

蓝咒 提交于 2020-02-11 02:57:29
1.首先准备自己微信、支付宝收款的二维码图片,然后把图片需要修改为bmp结尾的格式,如:zfb.bmp,zfb.bmp。 2.进入自己的博客园,点击 管理--->文件,在这里上传准备好的zfb.bmp,zfb.bmp文件。 3.复制下面的js代码 <script> window.tctipConfig = { imagePrefix: "http://static.tctip.com", cssPrefix: "http://static.tctip.com", buttonImageId: 4, buttonTip: "dashang", list:{ alipay: {qrimg: "https://files.cnblogs.com/files/love57/zfb.bmp"}, weixin:{qrimg: "https://files.cnblogs.com/files/love57/wx.bmp"}, } }; </script> <script src="http://static.tctip.com/js/tctip.min.js"></script> 4.修改如下js代码代码即可: alipay: {qrimg: "https://files.cnblogs.com/files/love57/zfb.bmp"}, weixin:{qrimg: "https:/

js倒计时 精确到毫秒

本小妞迷上赌 提交于 2020-02-11 02:10:18
<html> <head> <script language=javascript> <!-- //document.write(""); function show_date_time(){ window.setTimeout("show_date_time()", 1); BirthDay=new Date("5-1-2007");//设置日期 today=new Date(); timeold=(BirthDay.getTime()-today.getTime()); sectimeold=timeold/1000 secondsold=Math.floor(sectimeold); msPerDay=24*60*60*1000 e_daysold=timeold/msPerDay 淘宝女装夏装新款 daysold=Math.floor(e_daysold); e_hrsold=(e_daysold-daysold)*24; hrsold=Math.floor(e_hrsold); e_minsold=(e_hrsold-hrsold)*60; minsold=Math.floor((e_hrsold-hrsold)*60); e_seconds = (e_minsold-minsold)*60; seconds=Math.floor((e_minsold-minsold)

JS处理接口返回XML格式数据

送分小仙女□ 提交于 2020-02-11 01:29:55
JS处理接口返回XML格式数据 < oauth > < status > PERMISSION_ACCESS_TOKEN_EXPIRED </ status > < code > error.permission.accessTokenExpired </ code > < message > Access_token is expired or invalid </ message > </ oauth > 对返回的数据进行处理 //生成新的DOM解析器 const parser = new DOMParser ( ) ; //读取返回字符串 const _xml = parser . parseFromString ( data , "text/xml" ) ; //获取 code 节点中内容 const htmlContent = _xml . getElementsByTagName ( "code" ) [ 0 ] . innerHTML ; //获得json数组 const jsonArr = JSON . parse ( htmlContent ) ; 对获取到的节点内容进行相应的判断 如果是对返回的code 的编码进行判断 let msg ; switch ( htmlContent ) { // 为上面获取到的code的几点内容 case "case1" :

js延迟加载的方式有哪些?

泪湿孤枕 提交于 2020-02-11 01:10:38
共有:defer和async、动态创建DOM方式(用得最多)、按需异步载入js defer属性 :(页面load后执行) HTML 4.01 为 <script> 标签定义了 defer 属性。 用途:表明脚本在执行时不会影响页面的构造。也就是说, 脚本会被延迟到整个页面都解析完毕之后再执行 。 在 <script> 元素中设置 defer 属性,等于告诉浏览器立即下载,但 延迟执行 。 <head> <script src="test1.js" defer="defer"></script> <script src="test2.js" defer="defer"></script> </head>    async 属性:(页面load前执行) HTML5 为 <script> 标签定义了 async 属性。与 defer 属性类似,都用于改变处理脚本的行为。同样,只适用于 外部脚本文件 。 目的:不让页面等待脚本下载和执行,从而异步加载页面其他内容。异步脚本一定会在页面 load 事件前执行。 不能保证脚本会按顺序执行。 <head> <script src="test1.js" async></script> <script src="test2.js" async></script> </head> <body>    动态创建Dom: //这些代码应被放置在</body