立即执行函数的定义
立即执行函数IIFE(自执行匿名函数): 定义了一个函数,无需引用,立即执行
即,理想状态下,我们希望立即执行函数是这样的
function(){}()
但是,在JavaScript脚本解析引擎中,这样是会报错的,报错为,后面的括号多余,因为实际上,function在js中,可以是个语句,也可以是个表达式,脚本引擎是为了区分function,认为,一般以function为行首,一律解析为这是个函数语句。
//function fn(){}为语句
function fn(){}
//function(){}为表达式
var fn=function(){}
扩展:语句和表达式的区别
语句
语句的构造如下:值、运算符、表达式、关键词和注释。
语句会按照它们被编写的顺序逐一执行。
表达式
会产生一个值,这个值可以放在语句任何需要的地方
语句和表达式的区别在于:语句是执行一系列操作,一般情况不需要返回值,而表达式需要得到值,一定需要返回值
立即执行函数的写法
解决的方法为,让function不在行首,使function成表达式 一般有两种写法
//第一种,将函数定义和调用包裹起来
(function(){}())
//第二种,将函数定义包裹起来,再调用
((function (){})())
相当于以下写法
var a=funcition(){}
a()
立即执行函数传参
立即执行函数传参的时候是这样的
//在函数内部a=10
((function (a){})(10))
立即执行函数的作用
1.形成闭包,并解决闭包引用外部变量的问题
<body>
<ul id="list">
<li>公司简介</li>
<li>联系我们</li>
<li>营销网络</li>
</ul>
<script>
var fn(){
var list = document.getElementById("list");
var li = list.children;
for(var i = 0 ;i<li.length;i++){
li[i].onclick=function(){
alert(i); // 结果总是3.而不是0,1,2
}
}
}
</script>
</body>
代码中,将li写在立即执行函数中,使之由全局变量成为局部变量,并让里面包含的函数使用。因为此时i是var 定义的,故挂载在全局作用域中,故当我们点击li时,循环肯定结束了,此时只能里外的引用的是全局中的i,循环结束后结果为3,所以要想点击输出0,1,2,就要使i有自己的作用域,应该使用立即执行函数或者使用es6中的块级作用域let定义,使每一个遍历的i有自己的作用域,如下
//立即执行函数
<script>
var fn(){
var list = document.getElementById("list");
var li = list.children;
for(var i = 0 ;i<li.length;i++){
(function(i){
li[i].onclick=function(){
alert(i); // 结果是0,1,2
}}(i))
}
}
</script>
//es6
<script>
var fn(){
var list = document.getElementById("list");
var li = list.children;
for(let i = 0 ;i<li.length;i++){
li[i].onclick=function(){
alert(i); // 结果是0,1,2
}
}
</script>
由此可知,一般情况下,立即执行函数和闭包经常一起出现,因为可以使变量由全局变量变成局部变量,故而形成闭包,
2.避免全局变量污染
不必为函数取名,避免全局变量污染,如果该函数只调用一次,则节省程序员找函数在哪被引用的时间
3.形成独立作用域,封装变量
立即执行函数里面的变量外部是不能访问的,因此确保变量不会被恶意修改,也可将变量封装
编写不易,点个赞关注一下再走吧!