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规范给的定义,如果没有实战经验,你很难从定义去理解它 ...
随机推荐
- JAVA Timer定时器使用方法
JAVA Timer 定时器测试 MyTask.java:package com.timer; import java.text.SimpleDateFormat;import java.util. ...
- php如何读取ini文件
很多时候,我们使用配置文件来读取配置,那么php如何使用ini文件呢? 代码如下: 例如将:数据库信息存到ini文件中,进行读取. <?php header('content-type:text ...
- AMD移动FP5平台时序解释
好文章推荐:https://wenku.baidu.com/view/199379576137ee06eef91828.html AMD(FP5封装)时序全解. 由于刚开始接触AMD移动平台,难免有错 ...
- 算法排序-NB三人组
快速排序: 堆排序: 二叉树: 两种特殊二叉树: 二叉树的存储方式: 小结: 堆排序正题: 向下调整: 堆排序过程: 堆排序-内置模块: 扩展问题topk: 归并排序: 怎么使用: NB三人组小结
- hdu1878欧拉回路(DFS+欧拉回路)
欧拉回路 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- javascript 返回上一页面
<a href="<a href="javascript :history.back(-1)">返回上一页</a>或<a href=& ...
- PHP获取IP
<?php $iipp = $_SERVER["REMOTE_ADDR"]; echo $iipp ; ?>
- linux的su和sudo(转载)
来源:http://www.jb51.net/LINUXjishu/12713.html 一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比 ...
- EasyPusher安卓Android手机直播推送之MediaCodec 硬编码H264格式
本文转自Holo的博客:http://blog.csdn.net/u013758734/article/details/50834770 最近在研究EasyDarwin的Push库EasyPusher ...
- flume采集微信小程序数据
flume采集微信小程序数据 flume收集前端埋点数据[1]POST请求http://f.x.com:50000数据格式: JsonArray数据格式示例:[{ "headers" ...