我觉得在说闭包之前,必须的知道一个东西,就是全局变量和局部变量。
全局变量和局部变量是相对的.
var num1 = 0;
function ClassA() {
var num1 = 10;
alert(num1);// 10
}
alert(num1); // 0
这个num1就是全局变量和局部变量。
// 在看一段js代码
function ClassA() {
var a = 2;
fun1 = function () {
return a;
};
}
var a = new ClassA();
var result = a.fun1(); // 2
alert(result); // 2
这就是一个简单的闭包。
简单的说:闭包就是函数中的函数,因为在ClassA中,变量a是它的独有的变量,在他的外部是不能访问的,但是有些时候,我们在外部又
需要这个变量,那么就可以使用闭包,返回这个变量。当然也可以把这个变量定义为全局的变量,但是当全局变量太多或者你不想这个变量
被ClassA以外的代码操作,闭包就是你的选择。
在看一段C#代码:
public class ClassA
{
private string str = "str";
public string GetStr()
{
return str;
}
}
这是一个类ClassA,它有个方法返回它的私有字段str。内部有个函数可以返回它的变量,这就是他们的相同的地方。
全局变量和局部变量是相对的.
var num1 = 0;
function ClassA() {
var num1 = 10;
alert(num1);// 10
}
alert(num1); // 0
这个num1就是全局变量和局部变量。
// 在看一段js代码
function ClassA() {
var a = 2;
fun1 = function () {
return a;
};
}
var a = new ClassA();
var result = a.fun1(); // 2
alert(result); // 2
这就是一个简单的闭包。
简单的说:闭包就是函数中的函数,因为在ClassA中,变量a是它的独有的变量,在他的外部是不能访问的,但是有些时候,我们在外部又
需要这个变量,那么就可以使用闭包,返回这个变量。当然也可以把这个变量定义为全局的变量,但是当全局变量太多或者你不想这个变量
被ClassA以外的代码操作,闭包就是你的选择。
在看一段C#代码:
public class ClassA
{
private string str = "str";
public string GetStr()
{
return str;
}
}
这是一个类ClassA,它有个方法返回它的私有字段str。内部有个函数可以返回它的变量,这就是他们的相同的地方。
不同的地方是js中的闭包可以在函数中继续使用函数返回其他的变量。
总的来说,在javascript中一个函数就是一个闭包。但是我们一般说的闭包是函数中的函数,这样的闭包功能才会更加的强大。
当然闭包也不能乱用,这样会造成内存的过度损耗。这个要从javascript的作用域和作用域链说起了。