Javascript:猜猜弹出的是啥?为啥?
背景
经常需要向新入职的年轻同学解释Javascript的两个概念:单线程和作用域链,今天就再写篇博客说明一下。
单线程
- 队列:只有一个用来存储回调方法的队列。
- 消费线程:只有一个消费线程,不停的从队列中取方法,然后进行调用。这也是为什么Javascript称作为单线程的原因。
- 生产线程:有多个生产线程,不同的向队列中插入方法,常见的生成线程有:定时器、Ajax和浏览器事件。这也是为什么Javascript称作为事件驱动的原因。
参考文章:http://www.cnblogs.com/happyframework/archive/2013/04/23/3035596.html。
作用域链条
局部变量不是存储在“栈”中的,不要试着用传统的“栈”式作用域来理解。
参考文章:http://www.cnblogs.com/happyframework/archive/2013/04/22/3034087.html。
示例
function sleep(millisecond){
var start = new Date();
while(new Date().getTime() - start.getTime() <= millisecond) {}
}
var a = 6;
setTimeout(function () {
alert(a);
a = 666;
}, 0);
sleep(5000);
a = 66;
这个例子的执行过程向队列里插入了2快代码:
第一块:sleep定义、局部变量a定义和赋值、setTimeout方法调用、sleep方法调用和a赋值。
第二块:setTimeout的第二个参数(匿名函数)的调用。
根据这个可以知道,匿名函数的执行是在a = 66之后执行的,结合作用域链的知识,可以知道弹出的结果是66。
备注
写的还不够清晰,基本上是QQ里聊天的内容,有些概念是我在网上找的,没有看Javascript规范,所以大家要慎重理解。
Javascript:猜猜弹出的是啥?为啥?的更多相关文章
- JavaScript插件——弹出框
(JavaScript插件——弹出框) 前言 阅读之前您也可以到Bootstrap3.0入门学习系列导航中进行查看http://www.cnblogs.com/aehyok/p/3404867.htm ...
- 使用JavaScript实现弹出层效果
声明 阅读本文需要有一定的HTML.CSS和JavaScript基础 设计 实现弹出层效果的思路非常简单:将待显示的内容先隐藏,在触发某种条件后(如点击按钮),将原本隐藏的内容显示出来. 实现 < ...
- JavaScript 之 弹出窗口总结
一.javascript 控制窗口关闭及刷新 //关闭弹窗 <script language="javascript"> window.close(); </sc ...
- javascript网页弹出层练习
网页中经常出现很多"popup"弹窗效果,这里做一个练习,给我们初学者一个参考. HTML代码: <div id="popup"></div& ...
- JavaScript实现弹出层(以layer.open为例)
首先,引用layer,自行下载. 添加如下两行 <script src=" ../layer/jquery.min.js"></script> <sc ...
- javascript关闭弹出窗体时刷新父窗体和居中显示弹出窗
居中显示用到了moveTO()方法: 关闭弹出窗时刷新父窗体用到了window.opener方法: 父窗体代码例如以下: <%@ Page Language="C#" Aut ...
- 使用JavaScript实现弹出层效果的简单实例
转自:https://www.jb51.net/article/85475.htm 实现弹出层效果的思路非常简单:将待显示的内容先隐藏,在触发某种条件后(如点击按钮),将原本隐藏的内容显示出来. 实现 ...
- html5+css3+javascript 自定义弹出窗口
效果图: 源码: 1.demo.jsp <%@ page contentType="text/html;charset=UTF-8" language="java& ...
- javascript只弹出一次框 再次刷新不弹出
.打开页面自动弹出 当关闭弹框的时候 设置cookie生存时间 再次刷新页面判断cookie是否失效 <html> <head> <meta charset=&qu ...
随机推荐
- 涨姿势系列之——内核环境下花式获得CSRSS进程id
这个是翻别人的代码时看到的,所以叫涨姿势系列.作者写了一个获取CSRSS进程PID的函数,结果我看了好久才看懂是这么一个作用.先放上代码 HANDLE GetCsrPid() { HANDLE Pro ...
- Docker镜像和容器
本节内容: 安装Docker 卸载docker 镜像基本操作 容器基本操作 一.安装Docker Docker 对 Linux 内核版本的最低要求是3.10,如果内核版本低于 3.10 会缺少一些运行 ...
- 《精通Python设计模式》学习之工厂方法
小书,在我以前作数据库的连接时,就用了这个工厂方法的. 归纳总结一下,更有利于成长吧. import xml.etree.ElementTree as etree import json class ...
- HDU - 4474 bfs好题
这个BFS并不是很好想.. 最主要的一点是每个余数只会被拿出来一次更新其他余数, 然后我用d[ i ]表示 到达 i 这个余数最短需要多长,然后从高位往低位贪心,判断成立的时候忘记了如果0被ban掉了 ...
- 使用linux mysql客户端建立表时遇到格式解析的问题
发现在notepad++写好的建表脚本,粘贴到linux客户端后,执行时总是报我的脚本有问题. 我看了又看,发现建表脚本本身是没有问题,问题出在"Tab"键上和注释上边了. 解决办 ...
- java_String、StringBuilder
在介绍String和StringBuilder前先学习一下equals方法和toString方法.API java1.6提取码:04b6 equals方法 equals方法,用于比较两个对象是否相同, ...
- 【原创】MHA二次检测功能测试
MHA提供了很多扩展的功能,其中有一个参数是secondary_check_script,这个参数可以使我们自定义扩展多路由,多链路的二次检测功能.减少网络故障切换,降低脑裂的发生. 在虚拟机上做了如 ...
- 【原创】MHA对MySQL master Too many connections错误的处理机制
有台服务器故障期间的现象: 1. 可以正常ping通 2. telnet服务端口报Too many connections错误 3. ssh连接不上 查看MHA的管理日志,在强制关机前的health ...
- 慎用 new、delete
C++ STL 为我们提供了一套容器.在多数情况下,这套容器已足够让我们使用.所以,需要我们自己去用 new/new []/delete/delete [] 来管理内存的必要性并不是很大.此外,自己管 ...
- Nodejs线上日志部署
Nodejs 被越来越多的使用到线上系统中,但线上系统没有日志怎么行呢. 一.forever记录日志 我的线上系统使用forever来启动服务,最开始就直接使用了forever来记录 forever ...