
一、可变范围
要了解闭包,必须首先了解Javascript的特殊变量范围。
变量的范围无非是两种:全局变量和局部变量。
Javascript语言的特点是全局变量可以在函数中直接读取。
var = 999;
函数f1(){
警报(N);
}
f1(999);
另一方面,函数中的局部变量不能从函数之外的函数中读取。
函数f1(){
var = 999;
}
警报(n);错误
这里的一个地方需要知道,当函数在变量中声明时,必须使用var命令。如果不使用它,实际上会声明一个全局变量!
函数f1(){
n=999;
}
(F1);
警报(n);999
两。如何从外部读取本地变量
由于种种原因,我们有时需要在函数中得到局部变量。然而,以前已经说过,在正常情况下,这是不能做到的,只能通过变量的方法才能实现。
这是函数的内部,然后定义一个函数。
函数f1(){
var = 999;
函数F2(){
警报(n);999
}
}
在上面的代码中,函数F2是包含在函数f1,当所有的局部变量在F1到F2可见。但反过来,F2的局部变量可见F1不是。这是Javascript语言的链范围结构,其中的子对象看在水平和水平的所有父对象的变量。因此,父对象的所有变量都可见到子对象,反之亦然。
由于F2可以读取F1中的局部变量,所以如果使用F2作为返回值,那么我们是否不能在F1之外读取它的内部变量呢!
函数f1(){
var = 999;
函数F2(){
警报(N);
}
F2返回;
}
var结果= f1();
结果(999);
三,闭包概念
代码最后一部分中的F2函数是闭包。
在各种专业文献中,闭包的定义非常抽象,很难理解,我的理解是闭包是可以读取其他函数内部变量的函数。
因为在Javascript语言,只有局部功能可以通过子函数中的阅读,我们可以简单的理解为关闭功能定义在一个函数。
因此,本质上,闭包是连接函数内部到函数外部的一个桥。
四,使用闭包
闭包可以在很多地方使用,它有两个应用程序:一个是读取函数内部变量的程序,另一个是保持变量在内存中的值。
你怎么理解这个句子请看下面的代码。
函数f1(){
var = 999;
纳德=功能(N = 1){ }
函数F2(){
警报(N);
}
返回F2;
}
var结果= f1();
结果(999);
NAdd();
结果(1000);
在这个代码中,结果实际上是一个封闭的包F2函数,它总共运行两次,第一次是999次,第二次是1000次,这证明函数f1中的局部变量n被保存在内存中,在f1调用后不会自动清除。
为什么会这样原因是F1是F2的父函数,F2被分配给一个全局变量,这导致F2总是在内存中。F2的存在依赖于F1,所以F1总是处于内存中,在调用完成后,垃圾回收机制(垃圾回收)将无法恢复它。
这段代码的另一个值得注意的方面是纳德=功能(N = 1){ }。首先,纳德关键词不使用前纳德,所以纳德是一个全局变量,而不是局部变量。其次,纳德的值是一个匿名函数(匿名函数),和匿名函数本身也是一个闭包,那么纳德相当于一个二传手,可对内的局部变量在功能操作。
五。使用封闭的注意点
1)因为闭包可以使函数中的变量存储在内存中,并且内存消耗很大,所以不能滥用。否则,它会导致网页的性能问题,并可能导致IE.内存泄漏。解决方案是删除在功能退出之前没有使用的所有本地变量。
2)关闭将在母函数的外部变化的母函数内部的变量的值。所以,如果你把父亲作为一个函数对象(客体),关闭作为它的公共方法(公共法)、内部变量作为它的私有属性(私人价值),那么我们必须小心,不要改变里面的母函数变量的值。
六、思考问题
如果您能够理解下面两段代码的运行结果,您应该了解闭包的操作机制。
代码片段1
窗口;
var对象{ { {
名称:我的对象
GetNameFunc:函数(){
返回函数(){
返回this.name;
};
}
};
警报(object.getnamefunc()());
代码段两
窗口;
var对象{ { {
名称:我的对象
GetNameFunc:函数(){
var =;
返回函数(){
返回that.name;
};
}
};
警报(object.getnamefunc()());
以上是本文的全部内容,希望大家能喜欢。