认识立即执行函数
立即执行函数也称作即时函数,首先看如下代码:
var fun = function(){console.log("hello world~")}
fun();
我们知道,可以通过函数名加圆括号的语法方式调用任意的一个函数。那么为什么函数名加上括号就能执行表达式呢?
那是因为这个函数名就相当于定义的函数的引用,也就相当于这个函数本身执行。那么在来思考,既然如此,直接在定义函数的时候加上括号是不是就可以执行函数了呢?改成如下形式:
function(){console.log("hello world~")}()
答案是不行的,因为底层不能准确识别定义函数的范围。给定义的函数划定一个范围,改成如下形式就可以正确调用:
(function(){console.log("hello world~")})()
分析上述代码:第一个圆括号仅仅是用于划定函数的范围,第二个括号用操作符,用于调用函数的。立即调用函数还可以有如下变体:
((function(){console.log("hello world~")})())
如果要为立即调用函数传参怎么办?定义函数的时候添加一个参数,调用的时候传入参数接口,如下所示:
((function(param){console.log(param)})("hello world~"))
立即执行函数用途
立即执行函数一个很重要的用途,是将其用于Javascript类库的开发。当我们开发一个类库的时候,很重要的一点就是,不希望让一些不必要的变量去污染全局空间,尤其是那些临时变量。
要解决这个问题,立即执行函数尤其有用,它可以帮助我们让类库尽可能的保持私有,并且可以有选择性的将一些变量暴露到全局命名空间内。Jquery框架就是如此,源码如下:
(function(window,undefined){
var jQuery = ...
window.jQuery = window.$ = jQuery;
} )(window)
jQuery框架将所有的变量都定义在函数内部,外部空间无法访问函数内部变量。然后通过全局的window对象对外暴露jquery对象。