理解js作用域链 原型链

作用域链
百度:js中一切都是对象,包括函数,拥有可以通过代码访问的属性和只有js引擎能够访问的属性,其中一个内部属性是 作用域,包含了函数被创建的时作用域中的所有对象的集合。称为函数的作用域。
通常来说,一段程序代码中使用的函数和变量不总是可用的,限定其可用的范围及作用域
作用域的使用提高了程序逻辑的局部性增强程序的可靠性,减少名字的冲突。
作用域链决定了哪些数据能够被函数访问,当一个函数创建后它的作用域链会被创建此函数的作用域中可访问的对象所填充。
每一个execution context 都会分配一个变量对象。变量对象的属性是由变量和函数申明构成。在函数上下文情况下,参数列表的值也会被加入到变量对象中作为属性。变量对象和当前作用域息息相关,不同的作用域变量对象互不相同,他保存了当前作用域的所有函数和变量。

关于global object
Global object 其实就是 变量对象。当js编译器开始执行的时候,会初始化一个global object 来关联全局的作用。对于全局作用域而言,global object j就是variable object.在浏览器端 被具象成为window 对象。也就是说global object == 全局环境的variable object == window

关于活动对像 activation object
在函数被激活的时候,活动对象会被创建并且会被分配给执行上下文,ao是由特殊的对象arguments初始化而成,随后被当做变量对象用作函数初始化。

执行环境和作用域链 execution Context and scope chain
执行环境可以抽象的理解为一个对象

executionContext:{
Variable object:vars,function declared,arguments
Scope chain: variable object + all parent scopes
thisValue :conext object
}

此外js解释器运行阶段还会维护一个环境栈。栈顶始终是正在执行的函数环境。

总结:
在ECMAScript 中只有函数可以创建一个新的作用域。在函数内部定义的变量和内部函数,函数外部是不能直接访问的。
变量对象是由变量和函数声明 组成的,如果再加上arguments 和形参,那么就是活动对象。
作用域链与原型链的类似。如果一个变量在函数自身的作用域(活动变量)中搜索不到,那么就会搜索父级作用域中的变量对象。以此类推。

静态作用域是一个语言拥有闭包的必须条件。ECMAScript 完全支持闭包,技术上是通过[[scope]] 实现的。

闭包是一个代码块和以静态方式存储所有父级作用域的一个集合体。所以通过这些作用域函数可以很容易的找到自由变量。
闭包中可能有多个函数有相同的父级作用域,那么同时操作父级作用域的数据时候,会出现问题。

var data =[];
For(var k = 0;k<3;k++){
Data[k] = function(){
Alert(k)
}
}
Data[0]()//3

这是因为所有这些函数拥有相同的[[scope]]

函数调用的的时候活动对象被创建,就是变量对象+arguments + 参数变量

作用域链:
这里写图片描述
这里写图片描述

原型链:
function SuperType(){
this.property = true;
}
SuperType.prototype.geSupertPropertyValue = function(){
alert(this.property);
}
function SubType(){
this.property = false;
}
SubType.prototype = new SuperType();
SubType.prototype.getSubPropertyValue = function(){
alert(this.property);
}
var instance = new SubType();
instance.geSupertPropertyValue ();//true

//会经过(1) 搜索实例(2) 搜索SubType.prototype(3) 搜索SuperType.prototype


__proto__ 是指向构造该实例的构造函数的原型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值