你不知道的javascript 笔记(上)
-
引擎、作用域
-
LHS
(赋值)、RHS
(查询) ---->逐层寻找 -
词法作用域与动态作用域
- javascript是基于词法作用域
-
函数作用域与块作用域
-
隐藏内部实现->避免命名冲突
-
立即执行函数
(function xxx(){ })();
-
匿名函数缺点
- 调试不方便
- 调用自身通过
arguments.callee
- 不方便代码阅读
-
-
变量提升
- 编译阶段
- 词法解析
- 函数声明(高)和变量声明优先级
-
闭包
-
模块
function A(){ function a(){} return { a:a } }
-
AMD
-
es6导入导出机制
-
-
this
- 默认
- 调用上下文
- 隐式绑定
- 显示绑定
- 硬绑定(call)后不可能再修改它的this
- 优先级
- 显式绑定 > 隐式绑定
- new > 隐式绑定
- 默认最低
- 箭头函数
- 箭头函数的绑定无法被修改(new也不行)
- 继承外层函数调用的this绑定
- 判断this绑定对象
- new调用?绑定到创建的对象
- call、appay、bind调用?绑定到指定的对象
- 上下文调用?绑定到那个上下文对象
- 默认,严格模式下绑定到undefined,否则全局对象
-
对象
- 类型
- 基本类型:
string
、boolean
、number
、null
、undefined
、symbol
- 复杂类型:
object
- 基本类型:
- 字符串字面量和String对象
- []与.区别
- [""]使用字符串来访问属性
- 属性名永远是字符串(自动转化)
- 可计算属性名 []
- 类型
-
数组
- 可添加属性
-
复制
JSON.parse(JSON.stringify())
Object.assign()
-
属性描述符
Object.getOwnPropertyDescriptor
Object.defineProperty
writable
configurable 可配置的,只能通过
defineProperty
修改,单向操作,无法撤回,还是能修改writable由true变为false,无法由 false改成true。禁止删除属性enumerable 可迭代的 for…in…
- 结合wirteable和configurable创建一个常量属性
- 禁止扩展
Object.preventExtensions()
-
密封
Object.seal()
- 冻结
Object.freeze()
- 冻结
-
枚举
- for …in… 遍历可枚举对象
Object.hasOwnProperty()
可枚举也可不枚举- for…of 和 for…in区别
- 数组内置的
arr[Symbol.iterator()]
—> 直到{done:true}
-
混入
- 显式混入
- mixin
- 与隐式混入
- 修改this指向
- 显式混入
-
原型
- 检查类 — instanceof
- 使用了bind绑定函数,目标函数的
.prototype
会代替硬绑定函数的.prototype
- 使用了bind绑定函数,目标函数的
isPrototypeOf
在a的整个[[prototype]]链中是否出现过Foo.prototypegetPrototype
获取一个对象的[[prototype]]setPrototypeOF
用来修改一个对象的[[prototype]]
- 检查类 — instanceof
-
创建关联
Object.create()
Object.create()
的第二个参数制定了需要添加到新对象中的属性名以及这些属性的描述符- 委托设计模式
-
委托行为
- 意味着某些对象在找不到属性或者方法引用时会把这个请求委托给另一个属性
- 如果需要自我调用,使用传统的具名函数表达书定义对应函数,不要使用es6的简洁方法