js高级 第六天
回顾
1.执行上下文与执行上下文栈
执行上下文:js代码的执行环境,分为:全局执行上下文和函数执行上下文
执行上下文栈:对执行上下文执行顺序进行一个排序(后进先出)
作用域
一段代码在程序中起作用的范围。分为全局作用域和局部作用域。
作用域链
* 多个上下级关系的作用域形成的链, 它的方向是从下向上的(从内到外)
* 查找变量时就是沿着作用域链来查找的
变量查找原则
在当前作用域下的执行上下文中查找对应的属性, 如果有直接返回, 否则进入2
* 在上一级作用域的执行上下文中查找对应的属性, 如果有直接返回, 否则进入3
* 再次执行2的相同操作, 直到全局作用域, 如果还找不到就抛出找不到的异常
执行上下文和作用域的区别
1. 区别1
* 全局作用域之外,每个函数都会创建自己的作用域,作用域在函数定义时就已经确定了。而不是在函数调用时
* 全局执行上下文环境是在全局作用域确定之后, js代码马上执行之前创建
* 函数执行上下文是在调用函数时, 函数体代码执行之前创建
2. 区别2
* 作用域是静态的, 只要函数定义好了就一直存在, 且不会再变化
* 执行上下文是动态的, 调用函数时创建, 函数调用结束时就会自动释放
3. 联系
* 执行上下文(对象)是从属于所在的作用域
* 全局上下文环境==>全局作用域
* 函数上下文环境==>对应的函数作用域
原型
每个函数对象下都有一个prototype属性。这个属性就是原型
原型分类
显示原型和隐式原型
1. 每个函数function都有一个prototype,即显式原型(属性)
2. 每个实例对象都有一个__proto__,可称为隐式原型(属性)
3. 对象的隐式原型的值 为其对应构造函数的显式原型的值
5. 总结:
* 函数的prototype属性: 在定义函数时定自动添加的, 默认值是一个空Object对象
* 对象的__proto__属性: 创建对象时自动添加的, 默认值为构造函数的prototype属性值
* 程序员能直接操作显式原型, 但不能直接操作隐式原型(ES6之前)
原型链 又叫隐式原型链
实例化对象的__proto__指向构造函数的prototype
构造函数prototype的__proto__指向Object.prototype
Object.prototype的__proto__指向null
原型链示意图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udZ163l5-1608024093850)(D:\webApp\p3-js高级-H1907A\2009A\day-06\media\原型链.png)]
内置构造函数(对象)
内置构造函数(对象):
Number String Boolean Null Undefined Object Array Function Date Math RegExp(正则)
原型中的属性
1. 读取对象的属性值时: 会自动到原型链中查找
2. 设置对象的属性值时: 不会查找原型链,
如果当前对象中没有此属性, 直接添加给实例化对象本身属性并设置其值
3. 方法一般定义在原型中, 属性一般通过构造函数定义在对象本身上