Web | JavaScript的闭包
闭包
function outter(){
var a = 1;
function inner(){
console.log(a);
}
return inner;
}
//进行函数调用
var inner = outter();
inner();
以上代码是最基本的闭包的形成.当outter函数开始调用的时候,它内部就形成了一个闭包,这个闭包存在使用了outter函数的a变量的inner函数的作用域中.所以当inner函数调用的时候,才能够仍然访问到outter函数的a变量.
所以可以看到闭包的一些特性.
闭包的形成:当外部函数的执行上下文被启动的时候,或者说是外部函数被调用的时候
闭包的位置: 闭包存放在内部函数的作用域中,名称为closure.
闭包的作用:能够让内部函数在外依然能够访问到外部函数的变量,延长了该变量的生命周期.
闭包的形成条件: 函数内里嵌套函数,并且内函数使用到了外部函数的变量.
闭包的释放: 闭包不会主动销毁,会造成轻微的内存泄露.可以自己选择主动的对内部方法进行释放,置为null.
那么闭包在JS中有何作用,我觉得闭包很大的作用在于弥补了JS语言的一些数据私密性的缺陷.
在JS中,没有类的概念,一切以函数为尊.而函数内部的一些属性和方法保证了一些权限,不可访问.那么这个时候闭包的作用就显现出来的.有点相当于其他语言中,构造了一些私有的属性和方法,然后提供了一个公开的接口以供访问调用,然后可以保证一些安全性.
在JS中,通过提供返回的一个函数内部方法,暴露一些可以公开的变量或者方法让人进行访问.
function Person(){
var name = "Jan";
// 名字可以公开,但是年纪不能公开
var age = 18;
function about(){
console.log('我的名字是'+this.name);
}
return about;
}
常见的闭包
- 将函数作为另一个函数的返回值
- 将函数作为实参传递给另一个函数调用
闭包相关面试题
function fun(n, o) {
console.log(o)
return {
fun: function (m) {
return fun(m, n)
}
}
}
var a = fun(0)
a.fun(1) // -- var b = fun(1,0)
a.fun(2) // var c = fun(2,0);
a.fun(3) // var d = fun(3,0)
// undefined,0,0,0
var b = fun(0).fun(1).fun(2).fun(3) //undefined,0,1,2
var c = fun(0).fun(1)
c.fun(2)
c.fun(3) //undefined,0,1,1
Web | JavaScript的闭包的更多相关文章
- JavaScript之闭包
JavaScript之闭包 在JavaScript中,闭包恐怕是很多人不能理解的一个概念了,甚至很多人也会把闭包和匿名函数混淆. 闭包是有权访问另一个函数作用域中的变量的函数.首先要明白的就是,闭包是 ...
- 深入理解JavaScript的闭包特性如何给循环中的对象添加事件
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- JavaScript作用域闭包简述
JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...
- JavaScript的闭包原理
什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 个人的理解是 ...
- Js(javaScript)的闭包原理
问题?什么是js(javaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 小编 ...
- 深入理解javascript的闭包
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...
- 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- javascript,jquery(闭包概念)(转)
偶尔听人说javascript闭包,让我联想起以前学编译原理和数字逻辑里讲的闭包,以前上课讲的闭包很难懂,而且含有递归的意思在里面,现在不想再查看里面的闭包概念. 但javascript我是经常要用, ...
- 理解Javascript 的闭包(closure)
要理解闭包的概念先从变量的作用域说去 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之 ...
随机推荐
- 文件路径太长无法删除 robocopy
方法一:新建空文件夹 D:\temp robocopy D:\temp D:\target\source\test /purge 或者在同一目录下,建一个空文件夹, test 在cmd下切换进入到当 ...
- Akka - Basis for Distributed Computing
Some concepts as blow: Welcome to Akka, a set of open-source libraries for designing scalable, resil ...
- 项目经验:GIS<MapWinGIS>建模第二天
记录下GIS的进展情况
- Install MySQL on Mac
1. 可参考此文章:http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html 2. 目前MySQL(我用的mysql 5 ...
- Grunt入门学习之(1) -- 环境安装
Grunt入门学习(1) - 环境安装 这周根据项目需要,在项目的基础上分模块开发了一个小的项目板块,但是在规范组织每个模块的代码和其依赖性时比较麻烦,需要一个项目板块的构建工具.各个模块都包括其对应 ...
- ASP.NET 控件不可编辑
前台页面的解析后的html代码为disabled="disabled",而在后台我们需要设置控件的Enabled=false:即可.
- SCRUM与XP的区别和联系
相同点:SCRUM和XP都是敏捷开发的方法论,都体现了快速反馈,强调交流,强调人的主观能动性等基本原则,而且多数“最佳实践活动”都互相适用. 不同点:Scrum非常突出Self-Orgnization ...
- 安装visual studio2017后 首次启动出现ActivityLog.xml异常解决方法
安装visual studio2017后 首次启动出现ActivityLog.xml异常解决方法 ps:操作系统是win10 在官网下载了vs2017社区版按照教程(教程链接在文末)安装完成之后,首次 ...
- codeforces 156D Clues(prufer序列)
codeforces 156D Clues 题意 给定一个无向图,不保证联通.求添加最少的边使它联通的方案数. 题解 根据prufer序列,带标号无根树的方案数是\(n^{n-2}\) 依这个思想构建 ...
- Webpack知识汇总
介绍 webpack把任何一个文件都看成是一个模块,模块间可以相互依赖(require or import),webpack的功能就是把相互依赖的文件打包在一起.webpack本身只能处理原生的Jav ...