Javascript——闭包作用域链
Posted Shuqi_memo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript——闭包作用域链相关的知识,希望对你有一定的参考价值。
1、闭包:是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式:在一个函数内部创建另一个函数。
function f(name){
return function(object){
var value = object[name];
...
}
}
加粗代码是内部函数(一个匿名函数)中的代码,代码中访问了外部函数中的变量name。
2、作用域链
1 function compare(v1,v2){ 2 if(v1<v2) return -1; 3 else if(v1>v2) return 1; 4 else return 0; 5 } 6 7 var result = compare(1,2);
以上代码先定义了compare()函数,然后又在全局作用域中调用它。后台的每个执行环境都有一个表示变量的对象——变量对象。全局环境的变量对象始终存在,但是像compare()这样的局部环境中的变量对象,则只有再函数执行的过程中存在。
创建compare()函数时,会先创建一个预先包含全局变量对象的作用域链,这个作用域链被保存再内部的[[Scope]]属性中。
当调用compare()函数的时候,会为函数创建一个执行环境,然后通过复制函数的[[Scope]]属性中的对象构建起执行环境的作用域链。
compare()函数的执行环境而言,其作用域包含连个变量对象:本地活动对象(arguments,v1,v2)和全局变量对象(compare,result)。作用域链本质上是一个指向变量对象的指针列表,它只引用但不实际包含变量对象。
无论什么时候在函数中访问一个变量的时候,就会从作用域链中搜索相应名字的变量。当函数执行完毕后,局部活动对象就会被销毁,内存中仅保存全局作用域。
以上是关于Javascript——闭包作用域链的主要内容,如果未能解决你的问题,请参考以下文章