博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Javascript:猜猜弹出的是啥?为啥?
阅读量:7087 次
发布时间:2019-06-28

本文共 736 字,大约阅读时间需要 2 分钟。

背景

经常需要向新入职的年轻同学解释Javascript的两个概念:单线程和作用域链,今天就再写篇博客说明一下。

单线程

  • 队列:只有一个用来存储回调方法的队列。
  • 消费线程:只有一个消费线程,不停的从队列中取方法,然后进行调用。这也是为什么Javascript称作为单线程的原因。
  • 生产线程:有多个生产线程,不同的向队列中插入方法,常见的生成线程有:定时器、Ajax和浏览器事件。这也是为什么Javascript称作为事件驱动的原因。

参考文章:。

作用域链条

局部变量不是存储在“栈”中的,不要试着用传统的“栈”式作用域来理解。

参考文章:。

示例

1 function sleep(millisecond){ 2   var start = new Date(); 3   while(new Date().getTime() - start.getTime() <= millisecond) {} 4 } 5  6 var a = 6; 7 setTimeout(function () { 8     alert(a); 9     a = 666;10 }, 0);11 sleep(5000);12 a = 66;

这个例子的执行过程向队列里插入了2快代码:

第一块:sleep定义、局部变量a定义和赋值、setTimeout方法调用、sleep方法调用和a赋值。

第二块:setTimeout的第二个参数(匿名函数)的调用。

根据这个可以知道,匿名函数的执行是在a = 66之后执行的,结合作用域链的知识,可以知道弹出的结果是66。

备注

写的还不够清晰,基本上是QQ里聊天的内容,有些概念是我在网上找的,没有看Javascript规范,所以大家要慎重理解。

 

转载地址:http://dayql.baihongyu.com/

你可能感兴趣的文章
大型网站架构设计及技术总结
查看>>
phpunit assert断言分类整理
查看>>
springMVC robots.txt 处理
查看>>
python2.0_s12_day19_前端模版使用
查看>>
PHP json_decode object时报错Cannot use object of type stdClass as array
查看>>
hibernate一对一外键双向关联
查看>>
SharePoint 2013 同步FBA认证用户
查看>>
二叉树的遍历实现
查看>>
Sublimetext 3 经常使用插件
查看>>
Educational Codeforces Round 11 C. Hard Process 二分
查看>>
Android Camera 使用一例,视频聊天app
查看>>
区块链代币(Token)笔记 — — 术语
查看>>
python 解析json讲解(demjson)
查看>>
Apache优化:修改最大并发连接数
查看>>
Golang--Hello World
查看>>
《火球——UML大战需求分析》(第1章 大话UML)——1.4 如何学好UML?
查看>>
某IT校招笔试
查看>>
分布式系统介绍-PNUTS
查看>>
归并分类
查看>>
php生成图片验证码
查看>>