20200216

@czhang
  • date: 20200216
  • author: czhang

Plan

你不知道的 JavaScript 第四章 第五章

Notes

1. 提升(var function)

1. 只有声明本身会提升, 赋值或其他运行逻辑会留在原地
2. var a = 2 , 在编译阶段,会当成声明:var a 和 a = 2
3. 函数声明会被提升,但函数表达式不会被提升
4. 函数声明会被提升到普通变量之前
5. 普通块作用域中但函数声明,通常会被提升到所在作用域的顶部

2. 作用域闭包

1. 无论通过任何手段 将 内部函数 传递到 所在的词法作用域以外, 它都会持有对原始定义作用域对引用。 无论在何处执行这个函数,都是在使用闭包

3. 循环和闭包

for (var i = 1; i <= 5; i++) {
    setTimeout(function timer() {
        console.log(i);
    }, i * 1000);
}

三种方法:

1. 使用 IIFE 创建一个新的作用域,但空作用域不起作用,因此可在新作用域中添加 var j = i
2. 使用块及作用域, let j = i
3. for 循环中使用 let i, 变量在循环过程中不止一次被声明, 每次迭代都会使用上一次迭代结束时的值进行初始化

4. 模块

1. 使用IIFE 立即执行的返回值直接赋值给某个变量, 可实现单例 的模块
2. 模块函数的返回值必须至少包括一个内部函数的引用,这样就会创建涵盖整个函数作用域的闭包,可以在运行时的时候随便访问该函数的作用域内部东西
3. 现代模块机制
var MyModule = (function Manager() {
    var modules = {};
    var define(name , deps , impl){
        for(var i = 0; i<deps.length;i++>){
            deps[i]= modules[deps[i]]
        }
        modules[name]= impl.apply(impl,deps)
    }
    function get(name){
        return modules[name]
    }
    return {
        define:define,
        get:get
    }
})();
4. 未来模块机制 ==> ES6 module

More