js基础
闭包
闭包是js作用域设设计的一个应用,js是词法(静态)作用域,在访问变量的权限在声明时已确定好,而且访问变量规则是访问当前作用域以及父作用域,那么我想访问一个函数的私有变量(A)咋办?那我就return出去一个数据,这个数据引用了A,这样就间接的访问到私有变量A了,这就构成了闭包。
举例:
function func1() {
const _A = 1;
return function () {
const __A = _A;
return __A
}
}
const func2 = func1()
console.log(func2()) // 1
这段代码特殊在哪? 按道理讲,_A是func1的局部变量,执行完const func2 = func1()它应该就被干掉了,为啥执行完func1再执行func2还能访问到局部变量 _A,它咋那么牛逼?就因为闭包。
重点在执行const func2 = func1()时候可以理解以特殊的方式创建一个函数,特殊是指创建一个函数,并把fun1的私有作用域给到func2上
实现继承的几种方式
function Parent () {
this.a = "a"
}
// 1 new 关键字,缺点:多创建实例
const obj1 = new Parent()
// 2 原型链继承,缺点:重写就嗝屁了
const obj2 = {}
obj2.__proto__ = Parent.prototype;
Parent.prototype.constructor = obj2
// 3
const
上下文和作用域
上下文:
executionContextObj = {
scopeChain: { /* 作用域链:变量对象+ 所有父执行上下文的变量对象*/ },
variableObject: { /*变量对象:函数 arguments/参数,内部变量和函数声明 */ },
this: { /*运行这个函数的对象(动态的) */ }
}
typeof 和 instanceof
new 都干了啥
const _new = function (constructor, ...arg ) {
// 创建一个新对象,然后设置原型对象
const res = Object.create(constructor.prototype);
// 执行构造函数
constructor.apply(res, arg);
return res;
}
call、apply、bind区别以及模拟实现
ReactNative
ReactNative原理是怎样
ReactNative是一种混合开发技术,它的设计思想是利用React,也就是js层生成一个对应用的描述,然后通过jsc解析成一份json配置项,通过c++层编写的jsbridge传递给native端通过解析json,调用实际的原生端进行渲染应用
优势
- 优势就是跨平台性
- 可同时开发三端,逻辑一致性
- 性能出色,只有理论上的性能差距,实际体验上优化过的RN和原生可以说毫无差别
- 快速迭代,更新只需要新的替换jsbundle
- 打包快
劣势
- 性能有理论上的劣势
- 沟通成本大、跨端debug效率
- 安卓兼容性
- 和native端通讯只能是异步
- 需要有native端能力
- 如果要兼容三端,导航会有性能问题
- 安卓阴影支持差
- React Native在长列表
- 生命周期问题
- JavaScriptCore不一致
- 体积大小
- 手势冲突
- 平台不一致性、如switch组件、键盘处理、阴影、生命周期
- 编程范式不同,js端是mvvm的声明式编写代码
- 不天然支持强类型,而native端是强类型的,如果不引入ts,交互过多时,会有很多数据类型的问题
- native跳转RN 不可避免的会有起RN实例的时间,就算有缓存也会白屏一下
html5
- 语义化标签
- 音视频
- Web Sockets
- Web RTC
- 服务端推送事件(EventSource对象),用法:new一个EventSource对象,然后调用提供的api进行监听,然后服务端发送请求头为'event-tream'的数据
- DOM存储
- IndexedDB
- 摄像头api
- Canvas
- SVG
- webGL
- Web Workers
- 单独的全局作用域DedicatedWorkerGlobalScope
- history api
- pushState方法,只改变路由,不加载
- pushState() 绝对不会触发 hashchange
- replaceState 修改当前,不是新建
- HTML 焦点管理
- requestAnimationFrame 控制动画
- callback参数DOMHighResTimeStamp指示当前被 requestAnimationFrame() 排序的回调函数被触发的时间。
- Fullscreen API
React 生态
react-router
-
为什么要用react-router
单页应用利用ajax动态请求资源,然后解析后动态渲染页面,这样模拟跳转页面不需要重新请求大量资源
-
原理是什么?
先通过封装history api抹掉环境差异,然后通过pushState、replace等方法,改变路由历史、然后通过监听路由变化,动态更新资源
redux
mobx
其他web技术
跨域
cookie、token是啥
严格模式
bfc是啥
性能优化
其他随笔
- hasOwnProperty 是 JavaScript 中唯一一个处理属性并且不会遍历原型链的方法。(译者注:原文如此。另一种这样的方法:Object.keys())