javascript闭包和闭包的几种写法和用法
什么是闭包
闭包,官方的解释是:一个拥有需要许多变量和绑定了这=这些变量的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包的特点:
1 作为一个函数变量的引用,当函数返回时,其处于激活状态。2 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
简单的说,javascript允许使用内部函数----即函数定义个函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的局部变量、参数和声明和其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。、
在javascript中每个函数都有一个Prototype属性,而对象没有。
1 不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用,另外,此静态方法中无法使用this变量来调用对象其他的属性。
使用prototype属性定义的对象方法,是非静态方法,只有在实例化之后才能使用,其方法内部可以this来引用对象自身中的其他属性。
javascript闭包的用途
模拟面向对象的代码风格,
1 匿名自执行函数
let arr1=[1,2,3,4];
(function(arr){
alert(arr.join(","));
})(arr1);
匿名函数,立即执行,由于外部无法引用它内部的变量,因此在函数执行完之后会立刻释放资源,关键是不污染全局对象。
结果缓存 封装
实现类和继承
我们定义一个Person方法,就像一个类,定义方法继承Person,并添加自己的方法
function Person(){
this.Name="zhangsan";
this.age=20;
}
let demo=function(){};
demo.prototype=new Person();
demo.prototype.say=function(){alert('this is a say function')}
let a=new demo();
a.age //
a.Name //‘zhangsan’
a.say();
如果一个函数访问了它的外部变量,那么它就是一个闭包,闭包是一个函数,这个函数能够访问其他函数的作用域中的变量
闭包也会有很多弊端
function demo(){
var arr=[];
for(var i=0; i<10;i++){
arr[i]=function(){
console.log(i);
}
}
}
let arr=demo();
arr.map(fn=>{
fn();
});
结果打印的都是10;因为内部函数访问外部的变量,内存中i没有释放;想要达到预期的效果,可以改成如下:
function demo(){
var arr=[];
for(var i=0; i<10;i++){
arr[i]=function(num){
return function(){
console.log(num);
}
}(i);//立即执行的匿名函数,执行完之后就释放i的引用
}
}
let arr=demo();
arr.map(fn=>{
fn();
});
结果打印的是1 2 3 4 5 6 7 8 9
javascript闭包和闭包的几种写法和用法的更多相关文章
- 在JavaScript中创建命名空间的几种写法
在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子: var sayHello = function() { return 'Hel ...
- javascript之for循环的几种写法
背景 javascript中的for循环选择多种多样,可你知道其中的差别在哪里吗?什么时候又该用哪种循环才是最佳策略?以上这些是本文想讨论的,欢迎交流. 说明 1.20年前的for循环 //20年前的 ...
- JavaScript 点击事件的三种写法
嵌入式 <button οnclick='alert("hello")'>点击按钮</button> 脚本模型 btn.onclick=function() ...
- 全面理解Javascript闭包和闭包的几种写法及用途
好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途. 一.什么 ...
- 转 全面理解Javascript闭包和闭包的几种写法及用途
转自:http://www.cnblogs.com/yunfeifei/p/4019504.html 好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说ja ...
- 全面理解Javascript闭包和闭包的几种写法及用途【转】
一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...
- 全面理解JavaScript中的闭包的含义及用法
1.什么是闭包 闭包:闭包就是能够读取其他函数内部变量的函数;闭包简单理解成“定义在一个函数内部的函数”. 闭包的形式:即内部函数能够使用它所在级别的外部函数的参数,属性或者内部函数等,并且能在包含它 ...
- ExtJs--09--javascript对象的方法的3种写法 prototype通过原型设置方法效率最好
/** * javascript对象的方法的3种写法 推荐第三种 运行效率最好 */ function P(name , age){ this.name = name ; this.age = age ...
- 让你分分钟学会Javascript中的闭包
Javascript中的闭包 前面的话: 闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它 ...
随机推荐
- HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- ZOJ 3810 A Volcanic Island (2014年牡丹江赛区网络赛B题)
1.题目描写叙述:点击打开链接 2.解题思路:本题是四色定理的模板题.只是有几种情况要提前特判一下:n==1直接输出,1<n<5时候无解,n==6时候套用模板会出现同样的块.因此要特判一下 ...
- eclipse从svn检出项目
在eclipse的project explorer 右键->import->svn->从svn检出项目,然后填写资源库的位置,完成,然后一直next. 直到项目检出完成后,选择项目, ...
- D堆的实现
实现上一篇博客(http://blog.csdn.net/buleriver/article/details/38469977)说的D堆.假设把mD设置成2.D堆就退化成二叉堆,也就是说.二叉堆是D堆 ...
- MyEclipse的html/JSP编辑器添加代码自动提示
http://lusterfly.iteye.com/blog/1872627 在myeclipse 9以前的版本中,我们如果要为html编辑器添加自动的代码提示可以这样操作: windows--&g ...
- Windows App开发之集合控件与数据绑定
为ListView和GridView加入数据 ListView採用垂直堆叠得方式显示数据.而GridView则採用水平堆叠得方式. 长相的话嘛,它们都几乎相同. <Grid Name=" ...
- kubernetes资源调度之LimitRange
系列目录 LimitRange从字面意义上来看就是对范围进行限制,实际上是对cpu和内存资源使用范围的限制 前面我们讲到过资源配额,资源配额是对整个名称空间的资源的总限制,是从整体上来限制的,而Lim ...
- Unity3D 调用Java,Java调用Unity3D
1.无返回值 AndroidJavaClass fee = new AndroidJavaClass("com.wiker.Test"); fee.CallStatic(" ...
- [深入浅出Cocoa]iOS程序性能优化
本文转载至 http://blog.csdn.net/kesalin/article/details/8762032 [深入浅出Cocoa]iOS程序性能优化 罗朝辉 (http://blog.csd ...
- How to deploy a Delphi OSX project from the command line
Delphi has a well developed command line build process (via MSBuild) for Windows projects. After the ...