一、立即执行函数
立即执行函数(IFIE):此类函数没有声明,在一次执行之后会立即释放。适合做初始化工作。
我们平常所见的函数执行一般都是函数名加小括号,其实我们的立即执行函数与我们平时调用执行函数时的形式是一样的,让我们来看一下我们常见的几种立即执行函数的写法:
//第一种w3c标准推荐的写法
( function(){ }() )
//第二种常规写法
( function(){ } )()
//通过操作符
!function(){
//TODO
}()
+ function(){
//TODO
}()
- function(){
//TODO
}()
立即执行函数除了执行完之后立即释放之外,和普通函数没有任何区别
立即执行函数也可以有参数和返回值
(function(a,b,c){
return a+b+c;
})(1,2,3)
二、深入理解立即执行函数
我们需要特别记住以下两句话:
只有表达式才可以被执行符号执行,能被执行符号执行的函数就会自动放弃自己的函数声明
function test(){
//TODO
}()
我们这样写他是不是立即执行函数?
当然不是,因为我们知道 function name(){}这种形式的写法是叫做函数声明,他并不是一个表达式,所以当你在后面添加上小括号(在这里就是执行符)的时候,浏览器的js引擎会将上面的函数解析为下面的格式:
function test(){
//TODO
}
( )
所以他不会报错,但它也不是立即执行函数,因为只有表达式才可以被执行符执行,所以我们看到文章开头立即执行函数的几种形式,当你在函数外围加上小括号的时候他就是一个表达式了,所以当你在末尾添加上执行符小括号的他时候,他就会执行了,就相当于你调用定义的 “ 函数名()”这样执行一样。
var demo = function(){
console.log('IFIE');
}()
// 这个是函数表达式,那么在这个函数后面加上小括号,就可以立即执行,因为 “ = ”等号操作符,将后面的函数声明转化为了一个函数表达式,所以执行符可以将这个表达式执行
我们还要明白,当一个函数可以被执行符执行后,那么这个函数就放弃了自己原来的函数声明,也就是说,当这个函数立即执行之后我们是访问不到这个函数的
var a =(function text() ){
var b = 'IFIE';
console.log(b);
})();
//立即输出 ‘IFIE’
//接下来我们尝试访问test函数
test(); //报错:test is not defined
可以看到,当我们尝试访问test的时候是访问不到的,再看下面这样一个例子
var a = '1';
if( function f(){}){
a += typeof f;
}
console.log(a); // "1undefined"
打印出来的结果是字符串格式的1undefined,我们分析一下,在if判断语句里的 f 函数,因为函数声明被小括号括了起来,所以他此时相当于一个表达式,他是可以被执行符执行的,所以函数 f 就会放弃自己的函数声明,因此
typeof f 返回的就是字符串格式的 “undefined”,typeof就算这个变量没定义他也不会报错。