Javascript闭包细节和实例代码

Javascript闭包细节和实例代码
Javascript闭包

闭包是Javascript的一个重要概念。对于初学者来说,闭包是一个非常抽象的概念,特别是由ECMA规范给定的定义。如果没有实践经验,很难通过定义来理解它。因此,本文将不对封闭的概念做一个大的描述,直接干商品,让你在几分钟内学会闭包!

1见关闭

当我开始一项新技术时,我首先要做的就是找到它的演示代码。对我们来说,看代码比自然语言更能理解事物的本质。例如,jQuery和Zepto核心代码是包含在一个大的封闭。因此,我想为您编写一个最简单和最原始的闭包来创建大脑中的闭包图像。
函数A(){
函数B(){
console.log(你好关闭!;
}
返回B;
}
var(a);
c()!
这是最简单的闭包。

在初步了解之后,我们简单地分析了它与普通函数的区别。上面的代码翻译成自然语言如下:

(1)定义公共函数a

(2)a中的公共函数b的定义

(3)A返回B

(4)执行A并将a返回的结果分配给变量C。

(5)c的执行

这5个步骤总结为一句话:

函数A的内部函数B由函数A以外的变量C引用。

这句话的后处理变成了一个壁橱的定义。

当一个内部函数被外部函数外部的变量引用时,就会形成一个闭包。

因此,当执行上述5个步骤时,定义了闭包!

这是关闭。

2闭包的使用

在了解闭包的作用之前,让我们先看看Javascript中的GC机制:

在Javascript中,如果对象不再被引用,对象将被GC回收,否则对象将始终存储在内存中。

在上面的例子中,B在A中定义,所以B依赖于A,而外部变量C指的是B,所以C间接引用a。

也就是说,A不会被GC回收,并且会一直保存在内存中,为了证明我们的推理,上面的例子稍微改进了。
函数A(){
var计数= 0;
函数B(){
计数+;
console.log(计数);
}
返回B;
}
var(a);
C(1);
C(2);
C(3);
计数是函数A中的一个变量,它的值在函数B中被改变,每次函数B被执行时,计数的值在原来的基础上被添加到1,因此函数A中的计数变量将被保存在内存中。

当我们需要在模块中定义一些变量,并希望这些变量保持在内存中,但不污染全局变量时,我们可以使用闭包来定义模块。

3高端写作方法

上述方法实际上是最原始的编写方法,在实际应用中,闭包和匿名函数将链接在一起:
(函数(文档){)
VaR的视口;
var obj = { {
init:函数(id){
视口= document.queryselector(+身份证# );
},
给:功能(孩子){
Viewport.appendChild(儿童);
},
removechild:功能(孩子){
Viewport.removeChild(儿童);
}
}
window.jview = obj;
}(文件);
这个组件的功能是初始化一个容器,然后添加到容器的子容器时,容器和删除

函数很简单,但这里有另一个概念:立即执行函数,一个简单的方法是如何实现闭包。

代码可以分为两部分:上面的(函数())和(第一),()是一个表达式,表达式本身是一个匿名函数,因此在这个表达式后面()表示这个匿名函数的实现。

因此,这个代码执行过程的执行可以分解如下:
函数(文档){
VaR的视口;
var obj = { {
init:函数(id){
视口= document.queryselector(+身份证# );
},
给:功能(孩子){
Viewport.appendChild(儿童);
},
removechild:功能(孩子){
Viewport.removeChild(儿童);
}
}
window.jview = obj;
};
f(文件);
在这个代码中,它似乎看到闭包的影子,但f中没有返回值,而且似乎没有闭包条件,并且注意代码:
window.jview = obj;
obj是定义在F对象的功能,该对象定义了一系列的方法,对window.jview = obj实现在全局窗口对象定义了一个变量,这个变量详细,指向一个obj对象是全局变量,详细的一个对象。但功能的obj对象和参考变量视图F的功能,所以省并不功能F是GC回收,视口会一直保存到内存,所以该方法满足封闭条件。

4简单总结

这是最简单的理解,关闭,关闭有更深的理解,这涉及到更多的,你需要了解JS的执行环境(执行上下文)(活动对象)、主动对象和功能域(范围)和范围(范围链链)的运行机制。但作为一个初学者,你不需要了解一下这些东西。在简单理解之后,您必须在实际项目中使用它们。当您使用更多时,您将对闭包有更深入的了解。

谢谢你的阅读。我希望你能帮助你,谢谢你对这个站的支持
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部