JavaScript 创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件。
比如说,当用户单击按钮或者提交表单数据时,就发生一个鼠标单击(onclick)事件,需要浏览器做出处理,返回给用户一个结果。
主要事件表:
```
当查找一个对象的某个属性时,会先从它自身的属性上查找,
如果找不到的话会从它的_proto_属性上查找,就是这个构造函数的prototype属性,
如果还没找到就会继续在_proto_上查找,直到最顶层,找不到则为undefined,
像这样一层一层去查找形成一个链式的称为原型链
```
new一个函数,中间发生了什么
1.开辟一个内存空间,也就是创建一个空对象,obj={}或obj=new Object()
2.将这个新对象的_proto_属性指向它构造函数的prototype
3.将构造函数this绑定为这个新对象,在空对象上挂在属性和方法(call或apply方式)
4.返回这个新对象
相同:都是改变函数上下文this指向
不同:bind返回的是一个函数,不会立即执行
传参的不同 apply第二个参数为数组形式
call apply都是对函数的直接调用
1.作为普通函数直接调用,this指向window
2.作为对象方法去调用的话,this指向调用它的这个对象
3.箭头函数,没有this,this取决于外层离它最近的非箭头函数的this
4.构造函数的this,指向创建这个构造函数的实例对象
1.词法作用域(静态作用域)
js采用的就是词法作用域
只有函数可以限定作用域
函数允许函数访问外层作用域的变量
函数在定义的时候决定了函数作用域,词法作用域关心函数在何处被定义
2.动态作用域
函数在调用的时候决定了函数作用域,动态作用域关心函数在何处被调用
变量取值会到创建这个变量的函数作用域中去查找,如果找不到会向上查找,直到查找到全局作用域,这就形成了一个作用域链
1.节流
2.防抖
1.原型链继承
2.构造函数继承
3.组合继承(原型链继承+构造函数继承)
4.原型式继承
5.寄生继承
6.组合寄生继承
定义在一个函数内部的函数,这个内部函数有权访问外部函数作用域的变量
优点:
缺点:
js在运行中的任务,有一套收集,排队,执行的特殊机制,这种机制就是事件循环
遇到同步事件直接执行,遇到异步事件分为宏任务和微任务
如果微任务列表里有任务,先执行微任务再执行宏任务
块级作用域 暂时性死区 能否被修改
没有this call apply方法修改this无效
没有prototype属性
没有argument
不能使用new 不能用作构造函数,会报错
持续更新中.......
node 事件循环见: https://www.jianshu.com/p/69d2b70d3163 。
参考: https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/?utm_source=html5weekly
we don't add another mutation microtask as one is already pending
三个概念: JS堆栈、宏任务、微任务。
js 是一个单线程语言。
在执行一个js文件的过程中, js堆栈 中一直有任务,执行过程中,如果碰到了 宏任务 或者 微任务 ,会将其分别放入 宏任务队列 和 微任务队列 中。
当js文件被执行完, js堆栈 为空,此时执行 微任务队列 中的所有任务。当执行 微任务 过程中碰到 宏任务 或者 微任务 ,同样会将其分别放入 宏任务队列 和 微任务队列 中。
当 微任务队列 为空,此时执行 宏任务队列 中的所有任务。在执行过程中
宏任务按顺序执行,且浏览器在每个宏任务之间渲染页面
所有微任务也按顺序执行,且在以下场景会立即执行所有微任务:
例子:
执行结果:(Chrome 89)