一: 什么是立即执行函数?
在了解立即执行函数之前先明确一下函数声明、函数表达式及匿名函数的形式。
//函数声明
function add() {
console.log("函数声明")
}
// 函数表达式
var sum = function() {
console.log("函数表达式")
}
// 匿名行数
function(){
console.log("匿名函数")
}
声明一个函数,并马上调用这个匿名函数就叫做立即执行函数;也可以说立即执行函数是一种语法,让你的函数在定义以后立即执行;
二:立即执行函数的表现形式
(function(e){
console.log(e);
})("我是立即执行函数")
var fun =function(e) {
console.log(e);
}("立即执行函数")
三:使用场景
var obj={
name:"Java",
age:18,
fn:function(){
return "Program:"+this.name+"age:"+this.age;
}
};
console.log(obj.fn());
var fn=function(){
return "赋给变量的匿名函数!";
}
//调用方式与调用普通函数一样
console.log(fn());
(document).ready(function(){});的简写,相当于window.onload = function(){} ,虽然这段jquery代码与javascript代码在功能上可以互换,但执行的时间不一样,前者页面框架加载完成就执行,后者页面中所有内容加载完成才执行。
闭包
(function(){})()不叫闭包叫立即执行函数,所谓闭包,要拆成闭和包,闭指代不想暴露给外部的数据,包指代将数据打包出去暴露给外部;之所以这么说原因在于JS的函数作用域,函数内部的变量函数外部无法访问,这形成了闭;函数外部想得到函数内部的变量,可以通过某些方法譬如通过return等语句将内部的变量暴露出去,这形成了包;因而——立即执行函数只是函数的一种调用方式,和闭包没有必然的联系;闭包是和作用域扯上关系的,而(function(){})()是函数声明完就执行,只是有时想要用到闭包那么可以用(function(){})()来构成闭包,而不是(function(){})()是闭包。闭包的本质是执行完后只返回有用的数据,包内变量完全销毁,防止全局污染。
闭包本身定义比较抽象,MDN官方上解释是:A closure is the combination of a function and the lexical environment within which that function was declared. 中文解释是:闭包是一个函数和该函数被定义时的词法环境的组合。