javascript
什么是闭包
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures
可在内部函数访问外部函数的作用域。在 javascript 中,每当创建一个函数,闭包就会在函数创建同
时创建出来。
优点
可从内部函数访问外层函数的作用域中的变量,且访问的变量长期驻扎在内存中,可供之后使用
避免全局污染
把变量存到独立作用域,作为私有成员存在
缺点
对内存消耗有负面。因内存函数保存对外层函数引用,导致无法垃圾回收,增大内存使用量
应用场景
循环中创建闭包,防止取到意外值
模块封装
继承与原型链
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
当谈到继承时,Javascript 只有一种结构: 对象。
每个实例对象 object 都有一个私有属性(称之为__proto__),指向它的构造函数的原型对象 prototype。该原型对象也有一个自己的原型对象__proto__,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。(javascript 是基于原型的)
继承方法
当继承的函数被调用时,this 指向的是当前继承的对象,而不是继承的函数所在的原型对象。
性能
在原型链上查找属性比较耗时,对性能有副作用。
4 个用于拓展原型链的方法
New-initialization(初始化)
Object.create()
Object.setPrototypeOf
__proto__
继承的实现原理
从构造函数实例化说起,当你再调用 new 的时候,js 实际上执行的是
然后当你执行, o.someProp,它检查 o 是否具有 someProp 属性。如果没有,它会查找 Object.getPrototypeOf(o).sompProp,如果仍旧没有,它会继续查找 Object.getPrototypeOf(Object.getPrototypeOf(o)).sompProp
箭头函数和普通函数的区别
箭头函数是匿名函数,不能作为构造函数,不能使用 new
箭头函数没有原型属性
箭头函数不能绑定 this,会将离自己最近的一个普通函数的 this 作为自己的 this
call、apply、bind 都无法改变箭头函数中的 this 指向
模块化
拆分为按需导入的单独模块
在 es6 之前使用的是 requirejs 和 seajs 实现模块化
requireJs 是基于 AMD 规范的模块化库,seaJs 是基于 CMD 规范的模块化库
一个 js 文件代表一个 js 模块
es6 模块化的基本规则、特点
每一个模块只加载一次,每一个 js 只执行一次,如果下次再去加载同目录下同文件,直接从内存中读取。一个模块就是一个单例,或者说就是一个对象
每一个模块内声明的变量都是局部变量(所有代码都运行在模块作用域),不会污染全局作用域
模块内部的变量或者函数可以通过 export 导出
一个模块可以导入别的模块
commonjs 与 es6 的 module 区别
两者模块导入语言不同,commonjs 是 module.exports,exports 导出,require 导入;es6 则 export 导
出,import 导入
commonjs 是运行时加载模块,es6 是在静态编译期间就确定模块的依赖
es6 在编译期间会将所有 import 提升至顶部,commonjs 不会提升 require
commonjs 导出的是一个值拷贝,会对加载结果进行缓存,一旦内部再修改这个值,则不会同步到外
部。es6 导出的是一个引用,内部修改可同步到外部
commonjs 中顶层 this 指向这个模块本身;es6 中顶层 this 指向 undefined
评论