javaScript中的闭包知识点
首先跟大家说一下,闭包的知识点不太好理解,很多资料上对闭包的解释都是很官方很学术很高深的,大家一看闭包的概念介绍什么的,肯定会懵逼,压根看不出什么来,也压根看不懂,其实我觉得,很多知识点根本没必要写的那么高大上,我觉得简单通俗易懂的把一个知识点描述出来,这样学起来才有意义,至于那些学术化高大上的概念介绍,我觉得完全是在装逼。
我举一个例子吧:
法律上有一个词叫做委托人,法律上对委托人这个词语有明确的解释,反正就是一大句话在解释什么是委托人,好像很高大上的样子,整的人懵逼,其实简单通俗的来说委托人就是,我想办一件事情,但是我自己不方便出面,我就叫别人替我办这件差事,那我就是委托人,替我办差事的那个家伙就是被委托人。
以上例子可能不是很恰当,反正就是那么个意思吧,不必钻牛角尖
下面言归正传
直接po图和代码
代码如下
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>js中的闭包知识</title>
<script type="text/javascript">
//全局变量
var a = 888;
function f1() {
//函数内部是可以访问全局变量的
console.log("a的值是" + a);
//在函数内部,如果没有使用var关键字来声明变量的话,那么该变量实际上是全局变量
c = 342300;
e = "江西省赣州市于都县";
//函数内部的局部变量
var b = 666; //在函数内部,如果使用var关键字来声明变量的话,那么该变量是局部变量
}
f1();
//c变量实际上是全局变量
console.log("c的值是" + c);
//e变量实际上是全局变量
console.log("e的值是" + e);
//全局范围内能否去访问一个函数内部的局部变量? 答案是不可以的
// console.log("b的值是" + b); //报错b is not defined 即变量b未定义
/*
需求:我就想去实现全局范围内去访问一个函数内部的局部变量的这个功能
闭包:
闭包就是要解决2个问题
1.全局范围内访问函数内部的局部变量
2.使变量所占用的内存不被释放
概念:
在全局范围内可以访问一个函数内部的局部变量
*/
function f2(){
var s = 24;
return s;
}
//这种情况不是闭包,因为这个f2()函数在执行完毕之后,变量s所占用的内存还是会被释放掉
var result = f2();
console.log("s的值是" + result);
function f3(){
function f4(){
console.log("我的csdn博客https://blog.csdn.net/czh500");
}
return f4; //返回值是f4,即返回值是函数地址
}
var f = f3();//通过f3函数返回值是f4,即返回值是f4函数的函数地址
f();//相当于是执行了f4()函数
/*
总结:
1.变量是可以指向一个函数的地址
2.函数也可以返回另一个函数的地址
*/
function f5(){
var y = 300;
function f6(){
console.log(y);
}
return f6; //返回值是f6,即返回值是函数地址
}
var fn = f5();//通过f5函数返回值是f6,即返回值是f6函数的函数地址
fn();//相当于是执行了f6()函数
//
function f7(){
var h = 800;
function f8(){
console.log(h++);
}
return f8; //返回值是f8,即返回值是函数地址
}
var myFn = f7();//通过f7函数返回值是f8,即返回值是f8函数的函数地址
myFn();//相当于是执行了f8()函数
//重复执行myFn函数,如果h的确是在内存中的话,重复执行函数就会导致h的累加
myFn();
myFn();
myFn();
//
function f9(){
var w = 260;
console.log(w++);
}
//重复执行f9函数,打印出来的w的值总是260,说明每次调用完f9函数,f9函数中的w变量都会被销毁释放掉
f9();
f9();
f9();
f9();
</script>
</head>
<body>
<h1>js中的闭包知识</h1>
</body>
</html>