javascript做用域链理解

执行上下文(Execution context,简称EC)
 
概念
 
每当控制器到达ECMAScript可执行代码的时候,就进入了一个执行上下文。
 
javascript中,EC分为三种:
 
全局级别的代码(全局执行上下文)
函数级别的代码(函数执行性上下文)
Eval的代码(eval执行上下文)
 
执行上下文对象包括三个关键属性,可能有其余自定义属性。
 
VO(Variable object), 变量对象 或者 AO(activation object),活动对象,是个字典,包括函数arguments对象,形参,内部变量,函数声明
 
Scope chain,做用域链对象,包括当前做用域的vo和全部父级做用域的vo。
 
this对象,Context object,上下文对象。
 
 
做用域链的链式结构
 
做用域链的链式结构,是AO有个父级变量对象的引用,用
__parent__内部属性指代。则经过对父级的应用造成一种
链式结构,以下图
 
做用域链结构图片
 
执行上下文的执行过程
 
EC的创建分为两个阶段:进入执行上下文阶段和代码执行阶段
 
1.进入上下文阶段
 
发生在函数调用时,在执行具体代码以前。作以下三件事:
建立做用域链(Scope Chain)
建立变量对象
设置this对象的值,this对象的值取决于对象的调用者,caller和调用方式决定了this的值。
 
变量对象中的变量值以下:
根据函数参数建立并初始化arguments对象
函数声明建立属性,关联具体函数
变量初始化为undefined(所谓变量提高)
 
同名覆盖原则
函数声明与参数同名 函数声明覆盖参数
变量与函数声明或参数同名,变量赋值前其有效
 
2.代码执行阶段
 
变量赋值
解释执行其余代码
 
执行上下文的建立会造成一个栈,新建立的执行上下文入栈,执行完毕则出栈。
 
程序执行时,首先进入全局执行上下文,Global Context入栈,
在全局中有函数调用,则会进入函数执行上下文,函数执行上下文入栈
 
执行上下文栈 图片
 
闭包

定义javascript

包含自由变量的函数就是闭包(自由变量指不是函数参数,也不是函数内部变量的变量,即外部变量)
该函数一般为内部函数,被返回,外部能够引用该函数,经过其访问自由变量。java

闭包的用途闭包

1. 读取函数内部的变量
2. 让变量的值始终保持在内存中,好比循环注册事件,在事件中访问循环变量,须要用闭包来保持循环变量
3. IIFE(当即调用的函数表达式),在引用了外部变量的时候,也会造成闭包,造成一个独立的做用域,防止变量污染函数

闭包注意点this

1. 闭包会使得父级做用域的变量都被保存在内存中,内存消耗大,在IE中可能会致使内存泄漏。少用闭包,或者将不使用的局部变量所有删除
2. 父级做用域的变量是共享,一个闭包修改了变量的值,其余闭包的值获取的值也会发生变化,容易产生错误spa

相关文章
相关标签/搜索