立即执行函数
立即执行函数是它会自动执行,而不需要你额外的去调用。
我们先来看看函数声明、函数表达式和匿名函数的写法。
函数声明
//函数声明
function fn(){
console.log('fn');
}
//函数调用
fn();
函数表达式
var f = function fn(){
console.log('fn');
}
f();//函数调用
匿名函数
var f = function(){
console.log('fn');
}
f();//函数调用
上面的例子我们都是要额外的调用函数才能让它执行,立即函数就是不需要我们额外的去调用它,它就可以自己运行。
立即执行函数常用写法
(function f(){.....})();//圆括号包住函数声明部分,后面再加一个括号,小的圆括号可以传参数
(function f(){.....}());//函数声明后加一个(),再用一个圆括号全部包住,小的圆括号可以传参数
立即执行函数它既可以是匿名函数也可以是命名函数。
function(){
console.log('fn');
}();
//报错:
Uncaught SyntaxError: Function statements require a function name
原因:js引擎看到function关键字后,那么后面跟的是函数声明语句,不应该以圆括号结尾。 解决:让js引擎知道圆括号前面的部分不是函数定义语句,而是一个表达式,让它可以运算。
//圆括号包裹函数部分
(function(){
console.log("f");
})();
//圆括号包裹整个
(function(){
console.log("f");
}());
//结果都是输出:f
除了用圆括号包裹之外,还有很多让js引擎认为它是一个表达式的方法。
//"!"运算符
!function(){
console.log("f");
}();
//"+"运算符
+function(){
console.log("f");
}();
//"-"运算符
-function(){
console.log("f");
}();
//"~"运算符
~function(){
console.log("f");
}();
//new
new function(){
console.log("f");
}();
//"="运算符
var f =function(){
console.log("f");
}();
立即执行函数的好处:通过定义一个匿名函数,创建了一个新的函数作用域,相当于创建了一个“私有”的命名空间,该命名空间的变量和方法,不会破坏污染全局的命名空间。此时若是想访问全局对象,将全局对象以参数形式传进去即可
(function(window){
.....
})(window);