数据的单向绑定
我们在做原生页面开发的时候,如果涉及到前端的数据动态展现,是如何做的呢?(这里排除了后端直接返回嵌入数据的HTML
页面的模式,比如说PHP
中的模式),比如下面的例子:
1 | <p></p> |
1 | const data = { value: 'hello' } |
通过 JavaScript
原生的DOM
操作方式,将数据动态填充到DOM
中,就是数据(Data
)到模板(DOM
)的绑定,这就是数据单向绑定。
我们在做原生页面开发的时候,如果涉及到前端的数据动态展现,是如何做的呢?(这里排除了后端直接返回嵌入数据的HTML
页面的模式,比如说PHP
中的模式),比如下面的例子:
1 | <p></p> |
1 | const data = { value: 'hello' } |
通过 JavaScript
原生的DOM
操作方式,将数据动态填充到DOM
中,就是数据(Data
)到模板(DOM
)的绑定,这就是数据单向绑定。
事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题。
比如说,下面的代码:
1 |
|
上面的代码当中一个div
元素当中有一个p
子元素,如果两个元素都有一个click
的处理函数,如果点击了inner
的话,其实outer
也算是被点击了的。那么我们怎么才能知道哪一个函数会首先被触发呢?为了解决这个问题微软和网景提出了两种几乎完全相反的概念。
在浏览器刚被设计出来的时候,那时的网页非常的简单,每个网页的资源占有率是非常低的,因此一个进程处理多个网页时可行的。然后在今天,大量网页变得日益复杂。把所有网页都放进一个进程的浏览器面临在健壮性,响应速度,安全性方面的挑战。
健壮性:现代浏览器大多都是多tab
架构,如果所有的tab
都存在于一个进程内部的话,如果其中的一个tab
崩溃,会影响其他的tab
,为每个tab
分配一个进程,则会有效避免这个问题。
响应速度:这个不赘述。
安全性:由于同一进程内的线程是共享资源与地址空间的,所以如果把不同的网页放在同一进程内,可能会导致数据泄露等问题。
jsx
其实不是个新鲜东西,就是react
的一个语法糖。他提供了一种方式,让我们可以在JavaScript
代码中编写类似于html
标签的内容,并且会在最终编译的过程中自动将这些HTML
标签转换为React
可以处理的代码。
JavaScript中的闭包其实是一个让函数返回另一个内部函数的过程,我们都知道,JavaScript中,函数其实也是一个变量,或者说是对象,所以,对于上述的过程,我们就能够理解,这种方式是能够被实现的。
闭包的具体实现方式:
其实,我们已经了解到了,JavaScript中,所有的东西都是对象,也就是所谓的“Object”
类型,但是,在JavaScript中,并没有真正的类的概念,所以,此处的对象并不像是Java或者Python中的那样,是由类实例化而来的,而是由键和值来组成的,对象其实就是以键命名的值的容器。
比如,我们使用typeof
来检查一个数组的类型,会发现,其实数组也是一个Object
1 | let a = [] |
目前主流的JavaScript引擎有以下几种。
引擎名称 | 应用平台 |
---|---|
V8 | Chrome & NodeJS |
SpiderMonkey | Firefox |
Chakra | IE & Edge |
JavascriptCore | Safari & React Native |
JavaScript 目前有 7 种基本类型,如下:
String
Number
Boolean
Null
Undefined
Object
Symbol
(ES6新增)调用栈,具有LIFO
(Last in, First out 后进先出)结构,用于存储在代码执行期间创建的所有执行上下文。
当JavaScript引擎首次读取脚本时,会创建一个全局执行上下文并将其push
到当前执行栈中。每当发生函数调用时,引擎都会为该函数创建一个新的执行上下文并push
到当前执行栈的栈顶。
引擎会运行执行上下文在执行栈栈顶的函数,根据LIFO
规则,当此函数运行完成后,其对应的执行上下文将会从执行栈中pop
出,上下文控制权将转到当前执行栈的下一个执行上下文。