Javascript中有两个十分重要的概念–作用域链和闭包。
我是这样理解作用域链的,在一个函数中,函数内部所有可以访问的变量,排成了一个栈,想根据某个变量名访问变量时,就从栈顶开始向下搜索,搜到的第一个就算是找到了。那么,这个栈是怎么排列的呢?栈顶,是函数的内部变量以及arguments,栈顶下面,是包含这个函数的内部变量和arguments,往下依次类推。
闭包又是什么呢?闭包是一个函数,这个函数突破了作用域链,可以访问另一个函数作用域中的变量。下面是一个例子:
function createFunction(name){
return function(){
alert(name); }; }
var printName = createFunction("John");
printName();//John
createFunction()中的匿名函数即是一个闭包。由于createFunction()是返回的匿名函数的父函数,所以匿名函数的作用域链上有createFunction(name)的参数即name,所以可以访问到;createFunction(name)运行完毕后,其活动对象不会被销毁,依然留在内存中,因为它的参数name还在被返回的匿名函数引用着。这样做会带来方便,但是也会多占内存,所以要慎用闭包。