js
javaScript引擎会常驻于内存中
宿主发起的任务称为宏任务, JavaScript 引擎发起的任务称为微任务。
行为都是一个事件循环, 所以 Node 术语, 也会把这部分称为事件循环。
宏观任务的队列就相当于事件循环
    var r = new Promise(function(resolve, reject) {
        console.log("a");
        resolve()
    });
    r.then(() => console.log("c"));
    console.log("b")
    // 输出顺序是a b c
    var r = new Promise(function(resolve, reject) {
        console.log("a");
        resolve()
    });
    setTimeout(() => console.log("d"), 0)
    r.then(() => console.log("c"));
    // console.log("b")

在宏观任务中,JavaScript 的promise还会产生异步代码,

有了宏观任务 和 微观任务 可以实现 js引擎级 和 宿主级的任务
例如 Promise永远在队列尾部添加微观任务。 setTimeout等宿主api, 则会添加宏观任务。
    var r = new Promise(function(resolve, reject) {
        console.log("a");
        resolve()
    });
    setTimeout(() => console.log("d"), 0)
    r.then(() => console.log("c"));
    console.log("b")微任务始终优先于宏任务:
微任务总会在下一个宏任务之前执行,在本身所属的宏任务结束后立即执行。

    function sleep(duration) {
        return new Promise(function(resolve, reject) {
            console.log("b");
            setTimeout(resolve, duration);
        })
    }
    console.log("a");
    sleep(5000).then(() => console.log("c"));
闭包其实只是一个绑定了执行环境的函数
- 环境部分 - 环境: 函数的词法环境(执行上下文的一部分) 
- 标识符列表: 函数中用到的未声明的变量 
 
- 表达式部分: 函数体 
javaScript中的函数完全符合闭包的定义。
它的环境部分是函数词法环境部分组成, 它的标识符列表是函数中用到的为声明变量, 它的表达式部分就是函数体
闭包对应的概念是“函数”


    var b = {}
    let c = 1
    this.a = 2;
在只有 var, 没有 let 的时代, 诞生了一个技巧:立即执行的函数表达式
创建一个函数, 并且立即执行, 来构造一个新的域,从而控制 var 的范围。
    ;
    (function() {
        var a;
        //code
    }());
    (function() {
        var a;
        //code
    })()
    void
    function() {
        var a;
        //code
    }();
    var b;
    void
    function() {
        var env = {
            b: 1
        };
        b = 2;
        console.log("In function b:", b);
        with(env) {
            var b = 3;
            console.log("In with b:", b);
        }
    }();
    console.log("Global b:", b);一下语句会产生 let 使用的作用域
- for 
- if 
- switch 
- try/catch/finally 

- 普通函数: function关键字 
- 箭头函数:⇒运算符定义的函数 
- 方法: 在class中定义的函数 
    class C {
        foo() {
            //code
        }
    }- 生成器函数 : function*定义 
    function foo * () {
        // code
    }- 类: 用class定义的类, 实际上也是函数 
    class Foo {
        constructor() {
            //code
        }
    }6,7,8 异步函数: 普通函数、箭头函数、生成器函数加上async关键字
    async function foo() {
        // code
    }
    const foo = async () => {
        // code
    }
    async function foo * () {
        // code
    }调用它所使用的引用: 我们获取函数的表达式,它实际上返回的并非是函数本身, 而是一个Reference类型
Reference 类型由有两部分组成 : 一个对象 和 一个属性值。
reference类型中的对象被当作 this 值
调用函数时使用的引用, 决定了函数 执行时刻的 this 值。
生成器函数、异步生成器函数或者
在javaSciprt标准中,为函数规定了用来保存定义时上下文的私有属性[[Environment]]
当一个函数执行时,会创建一条新的执行环境记录, 记录的外层词法环境 会被设置成函数的[[Environment]]
在JavaScript标准定义了[[thisMode]]私有属性
[[thisMode]]私有属性有三个值
- lexical: 从上下文中找this, 对应箭头函数 
- global: 表示当this为undefined时, 取全局对象,对应了普通函数 
- strrict: 严格模式, this按照调用时传入的值, null或者undefined 

    function foo() {
        try {
            return 0;
        } catch (err) {
        } finally {
            return 1;
        }
    }
    console.log(foo());
    //1语句块涉及到:
javaScript标准类型
Compltion Record表示一个语句执行完之后的结果
[[type]] 表示完成的类型, 有break continue return throw 和 normal几种类型
[[value]] 表示语句的返回值, 如果语句没有, 则是empty
[[target]] 表示语句的目标, 通常是一个javascript标签

普通语句执行时,会得到[[type]] 为normal的compltion Rcord, javaScript遇到这样的会继续执行下一条语句
这些语句只有表达式会产生[[value]]
例如 i =1; 产生 1; var i = 1; 产生undefined。
语句块 内部的语句的completion Record的[[type]] 不为normal, 就打断语句块后续的语句执行。
return 语句可能产生 return 或者 throw 类型的 Completion Record
    {
        var i = 1; // normal, empty, empty
        i++; // normal, 1, empty
        console.log(i) //normal, undefined, empty
    } // normal, undefined, empty
    //上文提到的有三个字段  控制类型语句分两部分:
- 对内部造成影响, 如 if\switch\while / for\try 
- 对外部产生影响 break、continue、return 、throw 


css选择器 第三优先级
“,”
伪元素:

dom api 
 range api
 range api
    var range = new Range(),
        firstText = p.childNodes[1],
        secondText = em.firstChild
    range.setStart(firstText, 9) // do not forget the leading space
    range.setEnd(secondText, 4)
最后更新于
这有帮助吗?