javascript闭包与匿名自执行函数的演变原理

js的闭包特性,使得js弄出一套稀奇古怪的语法。而对于这些特殊的语法,已经有点js基础的同学看起来还是比较吃力甚至头疼。下面深入浅出的js“匿名自执行函数”的演变过程。啥,你还不知道什么是“匿名自执行函数”?我想(function(){})();这种语法,在各位同学阅读js库源码时多多少少碰见过。对,就是这家伙!

首先,我们看些正常的js函数定义方式:

//常规函数
function normalFun(){
console.log(“normalFun”);
}
normalFun();

//函数变量

var fun = function() {
console.log(“fun”);
};

fun();

以上两种函数定义的方式都有个共同特点:函数有个名字,通过函数名字调用函数。好了,下面奇葩的事就发生了~


//闭包测试-匿名自执行函数:无参数
(function() {
console.log(“无参数”);

})();

瞧,我执行了一个函数,这个函数没名字~你咋知道是个函数呢?我用function定义的代码块啊。这个函数本来可以通过函数名的形式调用,现在只能边定义边调用了~函数体还要用个小括号括起来,后面的小括号就行调用过程,当然里面可以传参数的。

//闭包测试-匿名自执行函数:数字变量
(function(a) {
if(a) {
console.log(“参数为:” + a);
} else {
console.log(“无参数”);
}

})(12);

我传递了一个基本数据类型!

//闭包测试-匿名自执行函数:json变量
(function(a) {
if(a) {
console.log(“参数为:” + JSON.stringify(a));
} else {
console.log(“无参数”);
}
})({
aa: “test”
});

我又传递了一个json对象!!

//闭包测试-匿名自执行函数:函数变量
(function(a) {
if(a) {
a();
} else {
console.log(“无参数”);
}
})(function() {
console.log(“函数变量”);

});

凌乱了吧~我传了一个函数作为参数。像不像c语言的函数指针,像不像?

//闭包测试-匿名自执行函数:带参数的函数变量
(function(a) {
if(a) {
a(“test”);
} else {
console.log(“无参数”);
}
})(function(params) {
console.log(“函数变量,参数为:” + params);

});

这下我跪了~传了一个可以传参数的函数,这到底是谁撩谁啊~~

© 2016, 李德涛博客. 版权所有.

发表评论

电子邮件地址不会被公开。 必填项已用*标注