20200216
- 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