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 ...
随机推荐
- djngo快速实现--使用Bootstrap
继续django学习之旅,之前我们所做的Django练习前端都非常丑.这节我们使用Bootstrap,顿时使丑陋的页面变成白天鹅. 安装Bootstrap ...
- Tools - Notepad++
NotePad++ https://notepad-plus-plus.org/ 修改主题 依次点击设置---语言格式设置---选择主题,在显示界面中修改相关设置(背景色.前景色.字体等). 双文本横 ...
- javascript中&&和||的区别
javascript中&&和||的区别 &&和||操作符两边不是布尔类型时,系统会转换成布尔类型值再计算(空字符串.null.0都会被转成false),结果本身不变. ...
- C# 获取磁盘空间大小的方法
方法一:利用System.IO.DriveInfo.GetDrives方法来获取 /// /// 获取指定驱动器的空间总大小(单位为B) /// /// 只需输入代表驱动器的字母即可 (大写) /// ...
- ok6410 android driver(8)
In the past, we know how to create and run a simple character device driver on pc, goldfish and ok64 ...
- C#开发ActiveX网页截图控件
故事背景:Java组的小伙伴需要一个能在IE(还是6...)下截图并返回给网页的功能,但是IE做起来很麻烦(可能根本做不到),于是找到我写一个ActiveX控件实现此功能,想着可能还有其他小伙伴需要这 ...
- C#代码反编译 得到项目可运行源码
C#代码反编译 得到项目可运行源码 摘自:http://www.cnblogs.com/know/archive/2011/03/15/1985026.html 谈到"C#代码反编译&quo ...
- JQ关于浏览器宽高的获取方式
JQ关于浏览器宽高的获取方式 alert($(window).height()); //浏览器时下窗口可视区域高度alert($(document).height()); //浏览器时下窗口文档的高度 ...
- csharp:正则表达式采集网页数据
https://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex(v=vs.110).aspx https:/ ...
- window下安装redis
以cmd安装方法: .下载安装包:https://github.com/dmajkic/redis/downloads .安装包下载后根据操作系统选择对应版本文件,里面会有几个dll分别为: redi ...