javascript闭包和闭包的几种写法和用法
2024-09-29 17:40:02
什么是闭包
闭包,官方的解释是:一个拥有需要许多变量和绑定了这=这些变量的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。闭包的特点:
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
最新文章
- ABP源码分析三十一:ABP.AutoMapper
- 【无私分享:ASP.NET CORE 项目实战(第六章)】读取配置文件(一) appsettings.json
- C#创建安全的字典(Dictionary)存储结构
- 代码性能优化——task
- 【UR #2】树上GCD
- Mysql 中 iddata1的缩小步骤
- socket初级使用(客户端)
- wpf中button的无边框实现
- UVa 11524:In-Circle(解析几何)
- Sequel Pro 免费的MySQL管理客戶端(有SSH部分)
- JQuery(三) Ajax相关
- cf B Three matrices
- 房上的猫:StringBuffer类
- 如何把Excel中的单元格等对象保存成图片
- 超绚丽CSS3多色彩发光立方体旋转动画
- python coroutine
- python_面向对象魔法方法指南
- jquery添加用户 事例
- lombok 的使用
- 爬虫之动态HTML处理(Selenium与PhantomJS )