JavaScript的函数之自执行函数和闭包
前面讲到js函数的基本分类及使用,今天我们来聊一下自执行函数的原理以及简单闭包原理。
1.自执行函数
说到自执行函数,其实就是函数不用被调用,自身执行代码块代码。整体思路如下代码:
1.按照我们的想法,先声明一个匿名函数,然后在函数后面加上(),但是会发现报错。如下图:
按照上面的思路去理解,在匿名函数后面直接加上()应该是可以立即执行的,但这个函数报错了,而且报了两个错误,是因为浏览器在解析js代码的时候,遇到function会当做函数声明,然后检查语法,函数声明必须要有函数名,所以报错;第二个括号处的语法错误在于函数声明到花括号处,就已经结束了,后面的()会被当作分组操作符,这个()实际上已经和函数声明没关系了,但是既然有了分组操作符,那就要有表达式,不然会报错。
2顺着错误原因修改,代码如下:
//首先给方法加上名字,同时在第二个()中加入表达式,如下:functionfunc(){ }(1) // 此时代码不报错了,但是上面函数并没有立即执行,因为前面已经说过了,函数声明到{}末尾函数已经结束了,所以后面的()和函数没有关系,所以继续修改代码如下: (function (){ console.log("自执行函数"); }()) // 推荐此方法 (function (){ console.log("自执行函数1"); })() //是指是在function前面加上任意的操作符,让浏览器解析代码时,不将 function 开头的函数解析为函数的声明,如下:+function (){ console.log("自执行函数2"); }()
2.闭包
闭包就是能够读取其他函数内部变量的函数。因为只有函数内部的子函数才能读取局部变量,所以在本质上,闭包是函数内部和函数外部连接起来的桥梁。
简单举例如下:
// 通常情况下,涉及到变量的作用域问题,函数外面是不可以获取函数内部的变量的functionfunc(){ varnum=10; } // 调用函数func(); console.log(num);//num is not defined//通过闭包,可以在函数外面访问函数内部的变量 functionfunc1(){ varnum2=20; functionfunc2(){ returnnum2; } returnfunc2(); } console.log(func1());//20
通过return,将函数作为返回值返回,同时返回的函数中再返回函数func2内的变量,这是函数外面就可以获取到函数内部的变量了。
视频讲解地址:
1.https://www.bilibili.com/video/BV1QK411W7gT/