【javascript】作用域和闭包浅析
作用域
分全局作用域和局部作用域
全局作用域:函数外部定义的变量,可以被整个program的各成员参照利用。
局部作用域:函数内部定义的变量,仅供该函数的各成员参照利用。
var val=1; //全局变量,全局作用域
function func(){
var val1 = 2; //局部变量,局部作用域 }
全局变量的内存在program结束时被销毁回收。
局部变量的内存在函数调用结束时即被销毁回收。
对作用域存在的意义的总结:
1,团队开发中,运用局部作用域可以避免同名变量的竞和
2,作用域不同时,同名的变量的值和意义完全不同
3,局部变量的内存保持期间是函数的执行期间,一旦函数执行结束,内存即被释放
4,全局变量的内存保持期间是program的存续期间,program结束,内存即被释放。
5,如果把只在函数内部利用的变量,定义成全局变量,让其存在于program的整个运行期间,是一种内存浪费。
闭包
闭包的作用就是保持一个局部变量的状态,延长其生存期。
如何做到这一点呢,闭包存在的前提条件如下:
①有函数嵌套
②子函数用了父函数的私有变量
③该子函数处在父函数的return里边
这样的话,父函数执行完毕,销毁内存的时候,因为返回的是子函数,子函数里又有对父函数私有变量的引用,该私有变量的内存将不会被销毁,而被保留。
下面的代码就是一个闭包的例子。val原本是一个局部变量,形成闭包以后,它的值可以一直被保到module这个对象被销毁时。
function func(){
var val=1;
return{
increment:function (){
val++;
},
show:function (){
alert(val);
}
}
};
//闭包形成
var module = func(); //val不会随着func的执行结束而销毁,可以持续到module这个对象被销毁时,延长了val变量的生存期
module.show(); //val = 1
module.increment();
module.show(); //val = 2
从上面的例子可以看出,如果不把函数设定给某个外部变量,闭包将无法形成。
函数func被赋给了module这个全局变量,那么此时module变量里究竟存了那些东西。
函数执行时,会自动生成函数对象,该对象包含内容如下,也就说这一串东西都被赋给了module这个全局变量,所以在module的存续期间,val的状态会被一直保持。
//func()执行时生成的函数对象
//{
// arguments:,
// this:,
// m:,函数的参数,如果有的话
// n:,函数的参数,如果有的话
// var:,
// increment:,
// show:,
//}
闭包可以把局部变量全局化,这算不算一种内存浪费,或者内存泄露呢?
【javascript】作用域和闭包浅析的更多相关文章
- javascript作用域和闭包之我见
javascript作用域和闭包之我见 看了<你不知道的JavaScript(上卷)>的第一部分--作用域和闭包,感受颇深,遂写一篇读书笔记加深印象.路过的大牛欢迎指点,对这方面不懂的同学 ...
- JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】
原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...
- JavaScript作用域和闭包
在JavaScript中,作用域是执行代码的上下文.作用域有3种类型: 1.全局作用域 2.局部作用域---(又叫函数作用域) 3.eval作用域 var foo =0;//全局作用域console. ...
- 举例详细说明javascript作用域、闭包原理以及性能问题(转)
转自:http://www.cnblogs.com/mrsunny/archive/2011/11/03/2233978.html 这可能是每一个jser都曾经为之头疼的却又非常经典的问题,关系到内存 ...
- JavaScript 作用域和闭包
作用域的嵌套将形成作用域链,函数的嵌套将形成闭包.闭包与作用域链是 JavaScript 区别于其它语言的重要特性之一. 作用域 JavaScript 中有两种作用域:函数作用域和全局作用域. 在一个 ...
- javascript作用域、闭包、对象与原型链
原文作者总结得特别好,自己收藏一下.^-^ 1.作用域1.1函数作用域JS的在函数中定义的局部变量只对这个函数内部可见,称之谓函数作用域.它没有块级作用域(因此if.for等语句中的花括号不是独立作用 ...
- javascript作用域与闭包
Javasript作用域概要 在javascript中,作用域是执行代码的上下文,作用域有三种类型: 1) 全局作用域 2) 局部作用域(函数作用域) 3) eval作用域 var foo = ...
- JavaScript作用域与闭包总结
1.全局作用域 所有浏览器都支持 window 对象,它表示浏览器窗口,JavaScript 全局对象.函数以及变量均自动成为 window 对象的成员.所以,全局变量是 window 对象的属性,全 ...
- javascript——作用域与闭包
http://www.cnblogs.com/lucio-yr/p/4047972.html 一.作用域: 在函数内部:用 var 声明的表示局部变量,未用var的是全局变量. 作用域取决于变量定义时 ...
随机推荐
- 图像开发的p2s模式:halcon+opencv的联动
[<zw版·Halcon与delphi系列原创教程> 图像开发的p2s模式:halcon+opencv的联动 尽管halcon功能强大,基本上cv只是halcon的一个子集,不过cv毕竟是 ...
- Timus 2068. Game of Nuts 解题报告
1.题目描述: 2068. Game of Nuts Time limit: 1.0 secondMemory limit: 64 MB The war for Westeros is still i ...
- 项目中如何GB2312转UTF-8
$str = mb_convert_encoding($str, "gb2312", "UTF-8"); // 这是一个PHP 自带函数 参数1 是要转的字符, ...
- windowsAPI遍历文件夹(速度高于递归)
#region API 遍历文件夹及其子文件夹和子文件 #region 声明WIN32API函数以及结构 ************************************** [DllImpo ...
- 关于获取web应用的文件路径的注意事项
今天在把数据写入文件时遇到了一个问题,指定的文件获取不到.一开始是这样的 URL url = XXX.class.getClassLoader().getResource(fileName);File ...
- ruby第一次实践 ”hello world“
下载ruby https://rubyinstaller.org/downloads/ 创建 ruby-version 写自己的版本 写Gemfile source: http://ruby.ta ...
- 在Ubuntu Server下配置LAMP环境
1. 下载Ubuntu Server,地址https://www.ubuntu.com/download/server 2. 在虚拟机上安装Ubuntu Server.根据安装引导过程一步步安装,跟在 ...
- vs快捷键大全
前言 作为一个.net开发员,你还在用鼠标去点击相应的操作么?如果你回答是,那么你太low了! 一个很厉害的程序员不会是那种这鼠标到处狂点的人,他们肯定会很多快捷键,所以为了离他们更近一步,我们必须学 ...
- URL中的保留和不安全字符
书写URL时要使用US-ASCII字符集可以显示的字符. http://www.google.com 如果需要在URL中使用不属于此字符集的字符,就要使用特殊的符号对该字符进行编码. 如:最常使用的空 ...
- 安装AdventureWorks2008R2
在微软的网站,有介绍安装示例数据库AdventureWorks的说明. 你可以在这里下载到压缩包 (AdventureWorks2008R2_Database.zip),解压后会得到两个文件: Adv ...