Promise
引言:
感觉promise的思想非常有意思,为了代码的可读性和可维护性提供了一种新的异步编程方法,接触了一段时间的工程代码也让我体会到代码可维护,可拓展的必要性。
为什么要用Promise?
对于异步操作,例如文件读取
1 | var fs = require('fs') |
React路由
SPA的理解
单页Web应用(single page web application,SPA)。
整个应用只有一个完整的页面。
点击页面中的链接不会刷新页面,只会做页面的局部更新。
数据都需要通过ajax请求获取, 并在前端异步展现。
路由
后端路由
注册路由: router.get(path, function(req, res))
工作过程:当node接收到一个请求时, 根据请求路径找到匹配的路由, 调用路由中的函数来处理请求, 返回响应数据
前端路由
注册路由:
<Route path="/test" component={Test}>工作过程:当浏览器的path变为/test时, 当前路由组件就会变为Test组件
JavaScript手写题
数组去重方法
对象拷贝方法
数组交集、并集、差集
数组扁平
实现一个new
new的具体步骤
- 内存中创建一个新对象
- 新建对象的 _ proto _指向构造函数的prototype
- 调用构造函数,函数的this指向新创建的对象
- 执行构造函数内部的代码(给新对象添加属性)
- 如果构造函数返回非空对象,则返回该对象,否则,返回新创建的对象
1 | function Person(age, name) { |
JavaScript垃圾回收
JavaSrcipt原型
JS原型是什么
首先,要明确几个点:
在JS里,万物皆对象。方法(Function)是对象,方法的原型(Function.prototype)是对象。因此,它们都会具有对象共有的特点。
即:对象具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。方法(Function)
方法这个特殊的对象,除了和其他对象一样有上述_proto_属性之外,还有自己特有的属性——原型属性(prototype),这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。
好啦,知道了这两个基本点,我们来看看上面这副图。
构造函数Foo()
构造函数的原型属性Foo.prototype指向了原型对象,在原型对象里有共有的方法,所有构造函数声明的实例(这里是f1,f2)都可以共享这个方法。原型对象Foo.prototype
Foo.prototype保存着实例共享的方法,有一个指针constructor指回构造函数。实例
f1和f2是Foo这个对象的两个实例,这两个对象也有属性__proto__,指向构造函数的原型对象,这样子就可以像上面1所说的访问原型对象的所有方法啦。
JavaScript执行上下文
前言:在看js垃圾回收时遇到相关问题,感觉自己对上下文对象理解的还是不够透彻(实在是太菜了)这就回来恶补。
执行上下文(Execution Context)
执行上下文是 JS 引擎为代码执行创建的运行环境,ES6 规范其由:
this 绑定
词法环境(Lexical Environment)
变量环境(Variable Environment)
三部分构成,三者在上下文的「创建阶段」初始化,「执行阶段」完成赋值与执行。
在 JavaScript 中,运行环境主要包含了全局环境和函数环境。
在 JavaScript 代码运行过程中,最先进入的是全局环境,而在函数被调用时则进入相应的函数环境。全局环境和函数环境所对应的执行上下文我们分别称为全局上下文和函数上下文。
在一个 JavaScript 文件中,经常会有多个函数被调用,也就是说在 JavaScript 代码运行过程中很可能会产生多个执行上下文,那么如何去管理这多个执行上下文呢?
执行上下文是以栈(一种 LIFO 的数据结构)的方式被存放起来的,我们称之为执行上下文栈(Execution Context Stack)。
在 JavaScript 代码开始执行时,首先进入全局环境,此时全局上下文被创建并入栈,之后当调用函数时则进入相应的函数环境,此时相应函数上下文被创建并入栈,当处于栈顶的执行上下文代码执行完毕后,则会将其出栈。
所以在执行上下文栈中,栈底永远是全局上下文,而栈顶则是当前正在执行的函数上下文。