Javascript 的单线程保证所有的任务都按照一定的规则顺序排队执行,这个规则就是 Event Loop 事件环。
![[事件循环] [事件循环]](/2019/01/24/event-loop/E0FB63E15116C0F2360ADEF559043ECB.jpg)
- 主线程运行时,JavaScript 会产生堆和栈(执行栈)
- 主线程调用 webApi 产生的异步操作只要产生结果就塞入“任务队列”等待执行
- 主线程同步任务执行完毕,读取“任务队列”中任务放入执行栈执行
- 执行栈执行过程中会产生新的异步操作,产生新的循环
Javascript 的单线程保证所有的任务都按照一定的规则顺序排队执行,这个规则就是 Event Loop 事件环。
解释:为了共享多个对象间的一些共有特征(属性或方法)
JavaScript 中的对象,都存在一个内置属性[[prototype]]
也做 __proto__
,指向这个对象的原型对象
js 中查找一个属性或方法,如果当前对象无定义会继续查找当前对象的原型对象,如果仍未找到,会继续查找原型对象的原型。如此直至最顶层的原型对象,如果仍未找到返回 undefined
最顶层的原型对象 为 Object.prototype
, 里面保存了最常用的 toString、valueOf、hasOwnProperty 等方法,故任何对象都可以开箱即用。
字面量方式创建对象,它的原型就是 Object.prototype
|
|
Js 在定义一个函数时,同时为这个函数定义了一个默认的 prototype
属性, 所有的共享的属性或方法都被放到这个属性指向的对象中。
由此看出,通过一个函数的构造调用创建的对象,它的原型就是这个函数的 prototype 属性指向的对象
|
|
第二篇主要是 react react-router react-redux
|
|
|
|
运行可见 Hello React!
|
|
第一篇主要是 webpack babel eslint
首先新建个空的文件夹并通过 终端
进入(后续所有操作基于终端)
|
|
Webpack 的安装需要借助于 npm ,所以我们您需要创建一个 package.json
Package.json 是一个标准的 npm 说明文件,里面保存着当前项目的基本信息,项目依赖以及自定义脚本任务等。
终端中使用 npm init
命令创建 package.json
执行 npm init
命令依次输入项目信息,或者直接 npm init -y
跳过这些信息的输入
|
|
准备工作完成,开始安装 webpack
webpack 4之后分成了 webpack 以及 webpack-cli 两个依赖,所以我们依次安装
|
|
接下来我们需要 创建一些文件和文件夹
当前目录下创建 src dist
两个文件夹 并在 src
里面创建两个文件 index.js
index.html
|
|
又来过基础
Execution Context(执行上下文)就是定义变量或函数有权访问的其他数据,并决定了他们的行为。
根据所在环境的不同一共有三种类型:
先进后出的结构,用于存储代码执行期间创建的所有执行上下文
JavaScript 引擎开始读取脚本时,先默认创建一个全局执行上下文并将其推入栈底,每发生一个函数调用,引擎就会为该函数创建一个新的执行上下文并压入栈。引擎会运行处于执行栈栈顶的函数,运行完后,其对应的上下文从栈中弹出,交还控制权给当前执行上下文的下一个执行上下文
执行栈简图如下:
注:每次函数调用都会创建新的 执行上下文,哪怕是递归调用
执行上下文分两个阶段创建: 1)创建阶段 2)执行阶段
1. 初始化作用域链
2. 创建变量对象
3. 创建参数对象,检查参数上下文,初始化其名称和值并创建一个引用拷贝
4. 扫描函数声明,对于未发现的函数在变量对象中创建一个同名属性,如果已经存在的发生**覆盖**
5. 扫描变量声明,未被发现的在变量对象中创建一个同名属性并初始化为 undefined,如果已存在,**跳过**
6. 确定上下文中的 this
注:如果 let 以及 const 声明创建阶段会跳过初始化
赋值、寻找函数引用以及解释/执行代码
所以执行上下文类似结构为:
当当前上下文执行时,变量对象变成活动对象,所以区别只是同一对象在执行上下文的不同阶段而已
|
|
变量以及函数声明的提升,原理就在于解析器创建变量对象的过程,不啰嗦。
知其然,知其所以然,想必是极好的
知其然,知其所以然
根据 ECMA-262 定义,JavaScript 中的变量区别于其他编程语言。JavaScript 中的变量只是用于保存特定值的名称,而变量的值数据类型可在脚本的生命周期改变。
也就是说“变量无类型,有类型的是变量的值”
JavaScript 中变量值可能包含两种数据类型:基本类型 和 引用类型。
ES5 中有五种基本数据类型:Undefined Null Boolean Number String,ES6 新增 Symbol
基本类型数据都是保存在栈中的简单数据,按值来访问的,可直接操作保存在变量中的实际的值
基本类型的值是不允许更改的,当你修改了变量的值,所做的只是创建了新值并复制到了原先变量值的位置
引用类型的值为保存在内存中的对象,区别于其他语言,JavaScript 中不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。而实际上对对象的操作是对对象引用的操作。
两种类型定义方式类似:创建变量并为变量赋值,但不同类型值可进行的操作却有不同:
我们可以为引用类型数据添加属性和方法,也可改变和删除属性和方法,而对于基本类型是不可以的
除了变量存储方式不同,变量的复制也存在着不同
这篇文章迟到了很久,暂且记录一下自己遇到的坑
因为目前就职公司采用的H5响应式驱动的主体项目,app 都是基于的 webview 开发,当 iPhone X 上市后,适配促成了新的兼容任务。
为了更好的适配 iPhone X,iOS 11 新增了几个特性用于处理那诡异的刘海屏。苹果公司还对 iPhone X 的屏幕内容作了安全距离限定,美其名曰为了更好的用户体验,其实就是为了填自己的坑。。
iOS11 新增特性,为了适应 iPhone X 对现有的 viewport meta 标签的一个扩展,定义网页在可视窗口的布局方式。safari 浏览器中开发模式可勾选支持调试。
属性:
详情见文档
iOS11 新增特性,webkit 的 css 函数,用于设定安全区域与边界的距离,有四个预定义变量。
我们需要关注的就是 safe-area-inset-bottom,对应也就是底部小黑条的处理
同时需要注意的就是,viewport-fit 为 contain 时,constant 函数是不起作用的,需要配合 cover 使用,不支持 constant 的浏览器会被忽略此属性
作为一个混迹windows的程序员,没事重装一下电脑简直和吃饭一样简单,但是每次装完都会被有些东东恶心到。。
装完系统,如果是u盘安装之类的话,大都会多出一个无效索引,也就是旧系统的索引,不能忍!
“Windows.old” 文件夹包含升级win10前系统的 “Windows”、“Program Files”、“Users”这三个目录中的文件,将之前的系统文件和安装的程序文件都做了备份。这是微软出于人性化的考虑,让没有来得及备份重要文件的用户可以再次选择备份。
对不起,我不打算考虑!
先扒一张图,来解释下浏览器的工作流程
上图可归纳为四步:
从以上不难看出,Repaint 和 Reflow 发生在了第三四步,故给出定义:
浏览器在解析页面时,根据 css 以及 js来计算并把相应的元素置于该出现的位置,这个过程就是 Reflow;
当元素的位置大小颜色确定后,浏览器会按照各自的属性进行绘制,这个过程就是 Repaint。故我们需要避免引发此类操作,
以此来提高渲染速度。
BFC 是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用。
当涉及到可视化布局的时候,BFC 为我们提供了一个环境,这个环境规定着其布局的规则,而不同环境之间的布局不会相互影响。
想要更好的理解这个概念,需要先理解 Box 和 Formatting Context 的概念。网页的布局核心就是盒子的组成排列,这些盒子就是 Box。盒子的类型和 display 属性决定着这个 Box 的类型。
不同类型的 Box,会参与不同的 Formatting Context(决定如何渲染文档的格式结构),然后其内元素就会以不同方式渲染。例如:
而 Formatting Context 是一块渲染区域,它决定着其子元素如何定位,以及与其他元素的位置关系。
通过上面一些概念,建议把 BFC 简单理解为一种属性,在具有此属性的容器中,元素按照 BFC 的规则实现布局。比如浮动元素会形成 BFC,这就是为什么我们看到浮动元素布局跟普通文档流的布局有所差别的原因。