Javascript中的作用域链与闭包
2014-10-03 20:34
363 查看
Javascript中有两个十分重要的概念–作用域链和闭包。
我是这样理解作用域链的,在一个函数中,函数内部所有可以访问的变量,排成了一个栈,想根据某个变量名访问变量时,就从栈顶开始向下搜索,搜到的第一个就算是找到了。那么,这个栈是怎么排列的呢?栈顶,是函数的内部变量以及arguments,栈顶下面,是包含这个函数的内部变量和arguments,往下依次类推。
闭包又是什么呢?闭包是一个函数,这个函数突破了作用域链,可以访问另一个函数作用域中的变量。下面是一个例子:
function createFunction(name){
return function(){
alert(name); }; }
var printName = createFunction("John");
printName();//JohncreateFunction()中的匿名函数即是一个闭包。由于createFunction()是返回的匿名函数的父函数,所以匿名函数的作用域链上有createFunction(name)的参数即name,所以可以访问到;createFunction(name)运行完毕后,其活动对象不会被销毁,依然留在内存中,因为它的参数name还在被返回的匿名函数引用着。这样做会带来方便,但是也会多占内存,所以要慎用闭包。
我是这样理解作用域链的,在一个函数中,函数内部所有可以访问的变量,排成了一个栈,想根据某个变量名访问变量时,就从栈顶开始向下搜索,搜到的第一个就算是找到了。那么,这个栈是怎么排列的呢?栈顶,是函数的内部变量以及arguments,栈顶下面,是包含这个函数的内部变量和arguments,往下依次类推。
闭包又是什么呢?闭包是一个函数,这个函数突破了作用域链,可以访问另一个函数作用域中的变量。下面是一个例子:
function createFunction(name){
return function(){
alert(name); }; }
var printName = createFunction("John");
printName();//JohncreateFunction()中的匿名函数即是一个闭包。由于createFunction()是返回的匿名函数的父函数,所以匿名函数的作用域链上有createFunction(name)的参数即name,所以可以访问到;createFunction(name)运行完毕后,其活动对象不会被销毁,依然留在内存中,因为它的参数name还在被返回的匿名函数引用着。这样做会带来方便,但是也会多占内存,所以要慎用闭包。
相关文章推荐
- javascript从作用域链谈闭包
- JavaScript关于作用域、作用域链和闭包的理解
- 个人理解的javascript作用域链与闭包
- JavaScript中作用域链和闭包
- JavaScript闭包-匿名函数和函数的作用域链
- JavaScript作用域链和闭包
- javascript从作用域链谈闭包
- JavaScript中的作用域链和闭包
- 深入理解javascript原型和闭包(14)--从自由变量到作用域链
- javascript执行上下文、作用域与闭包(第三篇)---自由变量与作用域链
- Javascript中闭包的作用域链
- 从 JavaScript 的作用域链到闭包
- !!JavaScript中的作用域链和闭包 整理
- (转载)浅谈JavaScript的闭包和作用域链
- 深入理解Javascript中的作用域链和闭包
- JavaScript关于作用域、作用域链和闭包的理解
- JavaScript作用域、作用域链、闭包详解
- [DIV/CSS] JavaScript作用域链与闭包的理解
- JavaScript之一: 闭包、执行环境、作用域链
- Javascript中闭包的作用域链