立即执行函数
立即执行函数是代码执行读到就立即执行,并且只执行一次,执行完毕后,立即销毁。所以,立即执行函数的一种初始化功能的函数。
立即执行函数有两种形式,第一种是W3C推荐的写法。
(function (){}())
(function (){})()
当代码执行到下面的语句时,会在控制台立即输出aaa、bbb,执行后会立即销毁。这就是立即执行函数。
(function () {
console.log('aaa');
}()); // 多个立即执行函数存在时,用分号隔开
(function () {
console.log('bbb');
})()
假如给立即执行函数一个函数名。同样会输入结果,但是在控制台输入函数名时,系统会报错,这就是销毁了立即执行函数
(function a() {
console.log('aaa');
}()); // W3C推荐写法
(function b() {
console.log('bbb');
})()
立即执行函数的本质
看 一个例子。
var demo = function text() { // 这是一个函数表达式
console.log('123');
console.log(demo.name);
}
demo();
demo是对函数text的引用,只有当调用demo时,函数才会执行,所以结果会输出 123 ;函数执行完毕后,会释放内存空间,销毁函数。在控制台输入函数名text时,系统报错。这就说明,在函数表达式中,函数的名字并没有起到作用,给不给都一样。但需要注意的一点是,demo.name = text。 除了这一点作用,函数的名字没有任何意义。这样也就是我们习惯在写函数表达式时直接使用匿名函数了。同样的,立即函数,也是没有函数名。
var demo = function () { // 这是一个函数表达式 使用匿名函数的形式
console.log('123');
}
demo();
只有表达式才能被执行符号执行。看下面的代码会不会执行?
var demo = function () { // 这是一个函数表达式
console.log('123');
}();
function arr() {
console.log('arr');
}(); // 报错报错
要记住,只有表达式!表达式!表达式!才能被执行符号执行。第二个函数就函数声明不是表达式,所以不执行,系统报错。第一个函数是表达式,必须会执行啊。只要是表达式加上执行符号,它就会立即执行。
再来看,想想下面的代码会不会打印出来?
+ function zheng() {
console.log('正号+执行');
}();
-function fu() {
console.log('负号 - 执行');
}();
! function tan() {
console.log('叹号!执行');
}();
答案是必须能打印出来的。这里要注意的是,+ - 是正负的意思不是加减,!是运算符。当加上 + 或 - 或!,后面的函数就变成表达式了,表达式紧接着加上" () ",就能被执行符号执行了,所以必须能执行。
所以,接下来我们就可以再来仔细看看立即执行函数的两种形式了。
第一种,最外层的 () ,它的本质就是一个数学运算中的小括号,这样里面的 function () {}() 就是表达式,可以被执行符号执行。此时表达式后面又带了执行符号 " () ",当然就能立即执行了。
(function (){}())
第二种,也是最外层的左边的 " () ",是数学运算符,function () {} 成了表达式,在表达式后面添加执行符号" () ",当然必须能执行啊。
(function (){})()
立即执行函数在学习闭包时,会有惊喜哦!!!