写点什么

javascript

用户头像
wudaxue
关注
发布于: 2021 年 04 月 02 日

什么是闭包

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures

可在内部函数访问外部函数的作用域。在 javascript 中,每当创建一个函数,闭包就会在函数创建同

时创建出来。

  • 优点

  • 可从内部函数访问外层函数的作用域中的变量,且访问的变量长期驻扎在内存中,可供之后使用

  • 避免全局污染

  • 把变量存到独立作用域,作为私有成员存在

  • 缺点

  • 对内存消耗有负面。因内存函数保存对外层函数引用,导致无法垃圾回收,增大内存使用量

  • 应用场景

  • 循环中创建闭包,防止取到意外值

for(var i = 0; i < 3; i ++) {  document.getElementById('id'+i).onfocus = function() {    alert(i)  }}//使用闭包解决function makeCallBack(num) {  return function() {    alert(num)  }}for(var i = 0; i < 3; i ++) {  document.getElementById('id'+i).onfocus = makeCallBack(i)}
复制代码
  • 模块封装

var A = (function(){  var foo = 0; //声明为模块私有变量,外界无法访问  function A() {}  A.prototype.bar = function B() {    return foo  }  return A}())
复制代码

继承与原型链

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

当谈到继承时,Javascript 只有一种结构: 对象。

每个实例对象 object 都有一个私有属性(称之为__proto__),指向它的构造函数的原型对象 prototype。该原型对象也有一个自己的原型对象__proto__,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。(javascript 是基于原型的)

  • 继承方法

当继承的函数被调用时,this 指向的是当前继承的对象,而不是继承的函数所在的原型对象。

var o = {	a: 2,  m: function () {  	return this.a + 1  }};
console.log(o.m()); //3 当调用o.m时, 'this'指向了o.
var p = Object.create(o) // p 是一个继承于o的方法p.a = 4; //创建p的自身属性console.log(p.m()); // 5 //调用p.m时,'this'指向了p,又因为p继承了o的m函数,所以,此时的'this.a'即p.a就是p的自身属性a
复制代码
  • 性能

在原型链上查找属性比较耗时,对性能有副作用。

  • 4 个用于拓展原型链的方法

  • New-initialization(初始化)

  • Object.create()

  • Object.setPrototypeOf

  • __proto__

  • 继承的实现原理

从构造函数实例化说起,当你再调用 new 的时候,js 实际上执行的是

var o = new Object()o.__proto__ = Foo.prototypeFoo.call(o)
复制代码

然后当你执行, 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

用户头像

wudaxue

关注

还未添加个人签名 2020.11.26 加入

还未添加个人简介

评论

发布
暂无评论
javascript