diff --git a/daily reading/2018.11.md b/daily reading/2018.11.md index 45be3b7..5b78408 100644 --- a/daily reading/2018.11.md +++ b/daily reading/2018.11.md @@ -2,13 +2,90 @@ +#### 11月12号 + +* [ES6 系列之 defineProperty 与 proxy](https://juejin.im/post/5be4f7cfe51d453339084530) + +* [一些使 JavaScript 更加简洁的小技巧](https://juejin.im/entry/5bd8e8b75188254a267ef788) + +* [理解JavaScript中的柯里化](https://juejin.im/post/5be5b5a65188250fa835897e) + + + #### 11月9号 -* [HTML5 History 模式](https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90) -* [理解 Javascript 执行上下文和执行栈](https://juejin.im/post/5bdfd3e151882516c6432c32) -* [JavaScript万物产生顺序](https://juejin.im/post/5bda64735188257f711e3596) +* #### 11月9号 + + * [HTML5 History 模式](https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90) + + * `vue-router` 默认使用hash 模式来模拟一个完整的 URL,当 URL 改变时,页面不会重新加载。 + + * 用路由的 **history 模式**替换hash模式,利用 `history.pushState` API 来完成 URL 跳转而无须重新加载页面。 + + ```js + const router = new VueRouter({ + mode: 'history', + routes: [...] + }) + ``` + + * 后台需要对路由进行配置 + + * [理解 Javascript 执行上下文和执行栈](https://juejin.im/post/5bdfd3e151882516c6432c32)(优) + + * 执行上下文总共有三种类型:**全局执行上下文**、**函数执行上下文**(只有在函数被调用的时候才会被创建)、**Eval 函数执行上下文** + + * LIFO原则,引擎首次读取脚本时,会创建一个全局执行上下文并将其推入当前的执行栈。每当发生一个函数调用,引擎都会为该函数创建一个新的执行上下文并将其推到当前执行栈的顶端。函数运行完成后,其对应的执行上下文将会从执行栈中弹出,上下文控制权将移到当前执行栈的下一个执行上下文。 + + * 执行上下文分两个阶段创建:**1)创建阶段;** **2)执行阶段** + + * 创建阶段发生三件事:**1)确定 this** 的值,也被称为 **This Binding**。**2)LexicalEnvironment(词法环境)** 组件被创建。**3)VariableEnvironment(变量环境)** 组件被创建。 + + * **环境记录** 还包含了一个 `arguments` 对象,该对象包含了索引和传递给函数的参数之间的映射以及传递给函数的参数的**长度(数量)**。 + + ```JS + function foo(a, b) { + var c = a + b; + } + foo(2, 3); + + // arguments 对象 + Arguments: {0: 2, 1: 3, length: 2}, + ``` + + * 在创建阶段,函数声明存储在环境中,而变量会被设置为 `undefined`(在 `var` 的情况下)或保持未初始化(在 `let` 和 `const` 的情况下)。所以这就是为什么可以在声明之前访问 `var` 定义的变量(尽管是 `undefined` ),但如果在声明之前访问 `let` 和 `const` 定义的变量就会提示引用错误的原因。这就是所谓的变量提升。 + + * 如果 Javascript 引擎在源代码中声明的实际位置找不到 `let` 变量的值,那么将为其分配 `undefined` 值。 + + + + * [JavaScript万物产生顺序](https://juejin.im/post/5bda64735188257f711e3596)(优) + + * 对于 `Object` 来说,它是一个 `Function`的实例,因为 `Object instanceof Function // true`;对于 `Function` 来说,它是 `Object` 的实例,因为 `Function instanceof Object // true`,所以到底是先有 `Object` 还是先有 `Function`呢? + * 一种理解:`Object`基于 `null` 为模板(`__proto__ `),所以`Object.prototype.__proto__ === null` + * `new Object` 创建一个对象,基于`Object.prototype`为模板,所以`new Object({}).__proto__ === Object.prototype` + + ```js + // Object + new Object().__proto__ === Object.prototype; + Object.__proto__ === Function.prototype; + Object.prototype.__proto__ === nulll; + + // Function + Function.prototype === Function.__proto__; + Function.prototype.__proto__ === Object.prototype; + + // Foo + new Foo().__proto__ === Foo.prototype; + Foo.prototype.__proto__ === Object.prototype; + Foo.__proto__ === Function.prototype + ``` + + ![image](https://camo.githubusercontent.com/71cab2efcf6fb8401a2f0ef49443dd94bffc1373/68747470733a2f2f757365722d676f6c642d63646e2e786974752e696f2f323031382f332f31332f313632316538613962636230383732643f773d34383826683d35393026663d706e6726733d313531373232) + + #### 11月8号 @@ -179,12 +256,53 @@ #### 11月5号 -* [使用Promises](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_promises) +* [使用Promises](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Using_promises)(优) + + * Promise 本质上是一个绑定了回调的对象,而不是将回调传进函数内部。 + + * 在 JavaScript 事件队列的当前运行完成之前,回调函数永远不会被调用 + + * 通过 .then 形式添加的回调函数,甚至都在异步操作完成之后才被添加的函数,都会被调用 + + * 如果想要在回调中获取上个 Promise 中的结果,上个 Promise 中必须要返回结果 + + * 在一个`.catch`操作之后可以继续使用链式`.then`操作 + + * 通常递归调用一个由异步函数组成的数组时相当于一个 Promise 链式:`Promise.resolve().then(func1).then(func2)` + + * 传递到then中的函数被置入了一个微任务队列,而不是立即执行,这意味着它是在JavaScript事件队列的所有运行时结束了,事件队列被清空之后才开始执行 + + * 嵌套的 catch 仅捕捉在其之前同时还必须是其作用域的 failureres,而捕捉不到在其链式以外或者其嵌套域以外的 error。 + + * 一个好的经验法则是总是返回或终止 Promise 链,并且一旦你得到一个新的 Promise,返回它。 + + * [基于webpack实现react组件的按需加载](https://fengmiaosen.github.io/2017/01/08/webpack-react-lazy-load/) + * 实现静态资源的按需加载,最大程度的减小首页加载模块体积和首屏加载时间,其提供的Code Splitting(代码分割)特性正是实现模块按需加载的关键方式。 + + * 将某些第三方基础框架模块(例如:moment、loadash)或者多个页面的公用模块(js、css)拆分出来独立打包加载,通常这些模块改动频率很低,将其与业务功能模块拆分出来并行加载,一方面可以最大限度的利用浏览器缓存,另一方面也可以大大降低多页面系统的代码冗余度。 + + * `CommonsChunkPlugin`将`公共基础库模块`单独打包到一个文件中 + + * 经常使用webpack的`css-loader`来将css样式导入到js模块中,再使用`style-loader`将css样式以`