zoukankan      html  css  js  c++  java
  • 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

    示例

     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规范,所以大家要慎重理解。

  • 相关阅读:
    与您分享
    与您分享
    与您分享
    与您分享
    与您分享
    分享:PythonSIP 4.14.2 发布
    与您分享
    编码
    分享:C++十种方法"Hello World"
    与您分享
  • 原文地址:https://www.cnblogs.com/happyframework/p/3160254.html
Copyright © 2011-2022 走看看