js作用域链和原型链

作用域链

如果要理解作用域链就要先理解作用域,所以要先明白作用域
一、作用域

作用域就是变量与函数的可访问范围
即作用域控制着变量与函数的可见性和生命周期

二、作用域分为全局作用域和局部作用域

全局作用域:代码在程序的任何地方都能被访问,window 对象的内置属性都拥有全局作用域。
局部作用域:在固定的代码片段才能被访问。函数内部的声明式函数也是局部函数

三、[[scope]]

[[scope]]: 每个JavaScript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供JavaScript引擎存取,
[[scope]]就是其中一个,[[scope]]指的是我们所说的作用域,其中存储了运行期上下文集合;

四、作用域链

作用域链: [[scope]]中所存储的执行期上下文对象集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链;
逐层衍生、逐层嵌套的作用域拥有以下的特性:
1.外层作用域无法调用内层作用域的变量和常量
2.代码执行需要时,优先引用当前所在执行环境中的变量和常量
3.直至追溯到最外层作用域( window 或 global)仍未定义的引用,即为 not defined.

原型链

JavaScript的所有对象中都包含了一个 __proto__内部属性,这个属性所对应的就是自身的原型,实例与原型之间的链条形成的链式结构叫做原型链
1.prototype

prototype是函数独有的属性,它从一个函数指向另一个对象,代表这个对象是这个函数的原型对象,这个对象也是当前函数所创建的实例的原型对象。
2.proto

__proto__属性是对象(包括函数)独有的。__proto__属性是从一个对象指向另一个对象,即从一个对象指向该对象的原型对象(也可以理解为父对象)
3.constructor

constructor是原型对象有的属性,它是从一个对象指向一个函数的。指向的函数就是该对象的构造函数。
原型链的一些特点

1.所有的实例的__ proto __ 都指向该构造函数的原型对象(prototype)。

2.所有的函数(包括构造函数)是Function的实例,所以所有函数的__ proto __的都指向Function的原型对象。

3.所有的原型对象(包括 Function的原型对象)都是Object的实例,所以__ proto__都指向 Object(构造函数)的原型对象。而Object构造函数的__ proto __指向 null。

4.Function构造函数本身就是Function的实例,所以__ proto __指向Function的原型对象。
当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值