首页 > 代码库 > Javascript——闭包、作用域链

Javascript——闭包、作用域链

1、闭包:是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式:在一个函数内部创建另一个函数

function f(name){

  return function(object){

    var value = http://www.mamicode.com/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——闭包、作用域链