作为一名野生开发者,没有系统的学习,js部分还是有很大的缺陷的,就比如这个iife,我竟然最近才了解到,很是汗颜哇!

IIFE定义:Immediately Invoked Function Expression,意为立即调用的函数表达式,也就是说,声明函数的同时立即调用这个函数

IIFE的出现是为了弥补JS在scope方面的缺陷:JS只有全局作用域(global scope)、函数作用域(function scope),从ES6开始才有块级作用域(block scope)

js写法

写法一:

var a = 6;//全局声明

//iife开始
(function(gl){
   var a = 5; //块级声明
   console.log(a); //调用块级变量 5
   console.log(gl.a); //调用全局变量 6
})(window)
//iife 以()结束

写法二:

var a = 6;//全局声明
//iife 开始
(function(gl){ 
	var a = 5  //块级声明
	console.log(a) //调用块级变量 5 
	console.log(gl.a) //调用全局变量 6
}(window))
//iife 结束

两者区别就是最后的 () 可以单独放,也可以放函数体内,看起来很像闭包的写法

IIFE和闭包的区别:

闭包 是指内部函数总是可以访问其所在的外部函数中声明的变量和参数。JavaScript 中的所有函数都是闭包的,JavaScript 中的函数会自动通过隐藏的 [[Environment]] 属性记住创建它们的位置,所以它们都可以访问外部变量