js闭包之初步理解( JavaScript closure)
闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解。
要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域,作用域分全局和局部,由于作用域链的存在,全局变量能在任何地方被访问到,相反,局部变
量只能在局部访问,而无法在全局的作用域中被访问。因为如果你想访问某个局部变量,首先搜索当前作用域中的变量,如果没有,就会继续向上搜索,直到作用域顶端。先看一个
例子:
var gl = 3;
var foo = function(){
var lo=2;
}
foo(); console.log(gl);//
console.log(lo);//lo is not defined
那么,要怎么在外部作用域中拿到局部作用域的变量呢?换句话说,我怎么在全局作用域中,拿到foo中的变量lo呢?
例子:
function foo() {
var x = 2;
function bar() {
console.log(x);
};
}
console.log(x);//x is not defined
我想在外部拿到x的值,该怎么做?
首先,在外部作用域中是无法访问到foo函数甚至bar中的变量的,来看,在bar的作用域中,是可以访问foo的作用域中的变量的,因此,我只要在调用foo函数时,将他内部的
bar函数返回出来,结果会怎样呢?改写一下以上代码:
function foo() {
var x = 2;
function bar() {
console.log(x);
};
return bar
}
var func = foo();
func(); //2
这样就拿到了x的值,这就是最简单的闭包。
再来看一个比较常见的闭包应用场景:
function f1() {
var a = 1;
return function() {
a++;
console.log(a);
}
}
var f2 = f1();
f2();//2
f2();//3
f2();//4
当我执行第一个f2的时候,a的值是从1变成了2,而在f1()调用时赋值给了f2,产生了一个引用,因此,a的值暂时被保存在闭包中或者是f2中,因此没有被js的垃圾回收机制回收掉,所以,当我再一次调用f2的时候,a的值是上一次的值,也就是2,那么此次调用a的值就变成3了,以此类推。
这些知识很基本的闭包基础,其实只要是在写js脚本,无时无刻都在不经意间会用到闭包,而闭包使用不当,会造成内存泄露,除非你强制关闭浏览器。
js闭包之初步理解( JavaScript closure)的更多相关文章
- javascript深入理解js闭包(个人理解,大神勿喷)
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- 如何理解javascript closure ?
接触过javascript的人应该听过闭包(closure),有一种观点认为是闭包赋予了javascript的强大能力,也赋予了它具备OOP的特征.既然javascript closure如此重要,那 ...
- (原创)JS闭包看代码理解
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- 对js闭包的粗浅理解
只能是粗浅的,毕竟js用法太灵活. 首先抛概念:闭包(closure)是函数对象与变量作用域链在某种形式上的关联,是一种对变量的获取机制.这样写鬼能看懂. 所以要大致搞清三个东西:函数对象(funct ...
- JS闭包的简单理解。优缺点以及垃圾回收机制
闭包是什么? ·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立:所以都可以访问全局变量 ·为了解决函数外部无法访问函数内局部 ...
- js闭包的真正理解
<高级程序设计>上,这样说:当在函数内部定义了其他函数时候,就创建了闭包.闭包有权访问包含函数内部的所有变量. 这个说的太晦涩了,而且我觉得很容易理解错,闭包就是一个嵌套函数嘛?但是我觉得 ...
- js 闭包的简单理解
let a = function(){ var i=0; let b = function(){ i++; alert(i); } return b; } let c = a(); c(); 这段代码 ...
- 关于JS闭包的一点理解
通常来讲,闭包通常是指函数内部可以访问到外部作用域的一个过程. 一.广义的定义:任何函数都产生了闭包. 二.狭义的定义:函数内部能访问到其他变量函数的作用域. 我们来看个例子 var a = 10; ...
- 【前端知识体系-JS相关】深入理解JavaScript异步和单线程
1. 为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Jav ...
随机推荐
- iframe无刷新跨域上传文件并获取返回值
通常我们会有一个统一的上传接口,这个接口会被其他的服务调用.如果出现不同域,还需要无刷新上传文件,并且获取返回值,这就有点麻烦了.比如,新浪微博启用了新域名www.weibo.com,但接口还是使用原 ...
- .NET 笔试题--自已作答
以下题目,我已全部作答,答案仅供参考!水平和理解有限,可能有误,欢迎指正,谢谢! 1. 填空: (1)面向对象的语言具有__继承______性._____多态____性.____封装____性. (2 ...
- 如何单独启动wamp 中自带的MySQL
前言:Wamp集成了Apache.MySQL和PHP环境.使用Wamp进行网站开发,是很多网站开发爱好者的选择.同时,其集成的MySQL服务,也常被用于MySQL的开发.这个时候我们只是想启动MySQ ...
- IE11之F12 Developer Tools--调试器(Debugger)
使用调试器工具在代码运行时对其导航.设置监视点和断点,查看调用堆栈,以及提高编译/精简JavaScript的可读性. 调试器可以帮助你了解为何你的代码片段会出现未按照预期方式运行.未在预期时间运行及在 ...
- linq之into子句
在Linq表达式中,into子句可以创建一个临时标识符,使用该标识符可以存储group.join或select子句的结果. 下面实例中我们用GroupOtherQuery方法来演示group子句对结果 ...
- asp.net中绘制大数据量的可交互的图表
在一个asp.net项目中要用到能绘制大数据量信息的图表,并且是可交互的(放大.缩小.导出.打印.实时数据),能够绘制多种图形. 为此进行了多方调查预研工作,预研过微软的MsChart图表组件.基于j ...
- AEAI WM V1.0 工作管理系统开源发版
AEAI WM工作管理系统是沈阳数通畅联软件公司基于AEAI DP平台开发的开源Java Web系统,用来管理记录日常工作内容及周工作内容等事务,AEAI WM工作管理系统包括一些核心的工作管理业务功 ...
- C#递归题目代码
一列数的规则如下: 1.1.2.3.5.8.13.21.34...... 求第30位数是多少, 用递归算法实现. 代码: public class MainClass { public static ...
- Free Slideshow, Gallery And Lightboxes Scripts
http://bootstraphelpers.codeplex.com/SourceControl/list/changesets https://github.com/gordon-matt/Bo ...
- Dubbo初探
Dubbo是什么? 1.阿里巴巴开源项目.2.Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. ps: SOA(面相服务的体系结构) RPC( ...