原型链是由原型工具构成,每个工具都有 __proto__ 属性,指向了建设该工具的结构函数的原型,__proto__ 将工具毗连起来构成了原型链。是一个用来实现担任和共享属性的有限的工具链。
- 属性查找机制: 当查找工具的属性时,假如实例工具自身不存在该属性,则沿着原型链往上一级查找,找到时则输出,不存在时,则继承沿着原型链往上一级查找,直至最顶级的原型工具
Object.prototype ,如照旧没找到,则输出undefined ;
- 属性修改机制: 只会修改实例工具自己的属性,假如不存在,则举办添加该属性,假如必要修改原型的属性时,则可以用:
b.prototype.x = 2 ;可是这样会造成全部担任于该工具的实例的属性产生改变。
3. 执行上下文(EC)
执行上下文可以简朴领略为一个工具:
-
它包括三个部门:
- 变量工具(VO)
- 浸染域链(词法浸染域)
this 指向
-
它的范例:
- 全局执行上下文
- 函数执行上下文
eval 执行上下文
-
代码执行进程:
- 建设 全局上下文 (global EC)
- 全局执行上下文 (caller) 逐行 自上而下 执行。碰着函数时,函数执行上下文 (callee) 被
push 到执行栈顶层
- 函数执行上下文被激活,成为 active EC, 开始执行函数中的代码,caller 被挂起
- 函数执行完后,callee 被
pop 移除出执行栈,节制权交还全局上下文 (caller),继承执行
2.变量工具
变量工具,是执行上下文中的一部门,可以抽象为一种 数据浸染域,着实也可以领略为就是一个简朴的工具,它存储着该执行上下文中的全部 变量和函数声明(不包括函数表达式)。
勾当工具 (AO): 当变量工具所处的上下文为 active EC 时,称为勾当工具。
3. 浸染域
执行上下文中还包括浸染域链。领略浸染域之前,先先容下浸染域。浸染域着实可领略为该上下文中声明的 变量和声明的浸染范畴。可分为 块级浸染域 和 函数浸染域
特征:
- 声明提前: 一个声明在函数体内都是可见的, 函数优先于变量
- 非匿名自执行函数,函数变量为 只读 状态,无法修改
- const foo = 1
- (function foo() {
- foo = 10 // 因为foo在函数中只为可读,因此赋值无效
- console.log(foo)
- }())
-
- // 功效打印: ƒ foo() { foo = 10 ; console.log(foo) }
4.浸染域链
我们知道,我们可以在执行上下文中会见到父级乃至全局的变量,这即是浸染域链的功勋。浸染域链可以领略为一组工具列表,包括 父级和自身的变量工具,因此我们便能通过浸染域链会见到父级里声明的变量可能函数。
-
由两部门构成:
[[scope]] 属性: 指向父级变量工具和浸染域链,也就是包括了父级的[[scope]] 和AO
- AO: 自身勾当工具
云云 [[scopr]] 包括[[scope]] ,便自上而下形成一条 链式浸染域。
5. 闭包
闭包属于一种非凡的浸染域,称为 静态浸染域。它的界说可以领略为: 父函数被烧毁 的环境下,返回出的子函数的[[scope]] 中如故保存着父级的单变量工具和浸染域链,因此可以继承会见到父级的变量工具,这样的函数称为闭包。
-
闭包会发生一个很经典的题目:
- 多个子函数的
[[scope]] 都是同时指向父级,是完全共享的。因此当父级的变量工具被修改时,全部子函数都受到影响。
-
办理:
- 变量可以通过 函数参数的情势 传入,停止行使默认的
[[scope]] 向上查找
- 行使
setTimeout 包裹,通过第三个参数传入
- 行使 块级浸染域,让变量成为本身上下文的属性,停止共享
6. script 引入方法:
- html 静态
<script> 引入
- js 动态插入
<script>
<script defer> : 异步加载,元素理会完成后执行
<script async> : 异步加载,与元素渲染并行执行
7. 工具的拷贝
|