MJingv / jehol-person-blog

Jehol's Blog 🙋 (hexo+react)
https://mjingv.github.io/JeholBlog/
0 stars 1 forks source link

js基础填坑 #15

Open MJingv opened 5 years ago

MJingv commented 5 years ago

易错点

  1. 变量提升

    var 声明的变量会发生提升

    var a = 10
    var a
    console.log(a)//10
  2. 函数提升

    优于变量提升

console.log(a) // ƒ a() {} function a() {} var a = 1



3. 总结

> 1. 函数提升优先于变量提升,函数提升会把整个函数挪到作用域顶部,变量提升只会把声明挪到作用域顶部
> 1. var 存在提升,我们能在声明之前使用。let、const 因为**暂时性死区**的原因,不能在声明前使用
> 1. var 在全局作用域下声明变量会导致变量挂载在 window 上,其他两者不会
> 1. let 和 const 作用基本一致,但是后者声明的变量不能再次赋值

***

symbol
---
- Symbol 生成一个全局**唯一**的值
- 唯一的值是多少不重要,唯一才重要
- obj.a=Symbol() obj.b=Symbol() a===b//false

闭包(Closure)
---
- 概念:「函数」和「函数内部能访问到的变量」(也叫环境)的总和,就是一个闭包。
- 作用:闭包常常用来「间接访问一个变量」。换句话说,「隐藏一个变量」
- 为什么要嵌套函数:是因为需要局部变量——隐藏变量

from
[「每日一题」JS 中的闭包是什么?](https://zhuanlan.zhihu.com/p/22486908?refer=study-fe)

others
---
- this
> 不管我们给函数 bind 几次,fn 中的 this 永远由第一次 bind 决定

- 数组
1.  push返回新的长度,pop返回pop的值
MJingv commented 5 years ago

from

浅拷贝

定义:浅克隆之所以被称为浅克隆,是因为对象只会被克隆最外部的一层,至于更深层的对象,则依然是通过引用指向同一块堆内存.

MJingv commented 5 years ago

原型理解

MJingv commented 5 years ago

模块化

  1. 立即执行函数

    避免污染全局作用域

  2. AMD 和 CMD

    不用了

// AMD define(['./a', './b'], function(a, b) { // 加载模块完毕可以使用 a.do() b.do() }) // CMD define(function(require, exports, module) { // 加载模块 // 可以把 require 写在函数体的任意地方实现延迟加载 var a = require('./a') a.doSomething() })


3. CommonJS
> node.js / webpack

4. ES Module
> 原生模块化实现方案
> ES Module 会编译成 require/exports 来执行的

```js
// 引入模块 API
import XXX from './a.js'
import { XXX } from './a.js'
// 导出模块 API
export function a() {}
export default function() {}

对比

ES module CommonJS
不支持动态导入 支持动态导入
异步导入(用于浏览器) 同步导入(用于服务端)
实时绑定(导入值随导出值变化) 非实时绑定(导出为值拷贝)

===

CJS vs ESM

https://segmentfault.com/a/1190000014318751

why模块化