实习大半年一直都在疯狂地产出垃圾代码,现在有时间梳理理解一下js中的一些概念。看过网上很多说闭包的博客,依然一知半解。于是动手敲了一些自己能想到的函数的形式,进行比较区别。下面谈谈我的理解。
javascript高程上对闭包的定义:闭包是指有权访问另一个函数作用域中的变量的函数。
首先谈谈我们平时写的函数
function f1() {
var num = 1;
num ++;
return num;
}
var result = f1();
result;//2
result;//2
这里result是一个变量值,f1()每次执行完之后都进行了自动销毁,num变量被垃圾机制回收。
在看一个函数嵌套函数的例子
function f1() {
var num = 1;
function f2() {
num ++;
return num;
}
};
var result = f1();
result;// undefined
在f1函数中声明了f2,并没有调用,所以不会执行。
添加一行调用f2的代码看一下运行结果
function f1() {
var num = 1;
function f2() {
num ++;
return num;
}
console.log(f2());
};
var result = f1();
2
result;// undefined
f2执行了,num值加1,但是f1函数并没有返回值。所以result的值为undefined。
那么问题来了,如果我在外部想取到f2中的num值,且希望每次num值增加过后再次调用会在原有基础上改变,而不是每次都初始化,怎么办呢。这就需要用到闭包。
闭包的形式简单来说,就是函数嵌套函数,内部函数作为外部函数的返回值。对外部变量采用的原型链引用的方式,并非值传递,所以每次修改都会对其产生影响,之后的每次引用都不会被初始化。
看一个例子:
num ++;
console.log(num);
}
result();//3
从上面代码可以看出,result是一个function,在函数f1外部定义result变量,可以访问其内部环境变量,同时函数执行完之后变量依然保存在内存中,不会被销毁。
可以通过执行 result = null解除对f2函数的引用,释放内存。
以上就是我对闭包的理解,有理解不当的地方欢迎指出。希望大家都可以动手敲一下代码,加深对闭包的理解。