什么是js中的自执行

之前node的时候用了人家封装的库,调进去看了一下,遇到下面这种类似代码:

1
(function(name){console.log(name)})('fengyun');

当时就在想这都什么玩意儿,我书读的少,写js不久,不要‘骗’我!以前没见过这种写法,于是百度之,才知道这是js里面的匿名函数自执行。这里面提到了两个关键字,一个是匿名函数,一个是自执行。

匿名函数简单来说就是没有名字的函数,不能其单独使用;

自执行就是函数在定义的时候就立即执行;

概念都好理解,举个例效果更好:

1
2
3
4
5
6
7
function say(){
console.log('我是一般函数')
}

function(){
console.log('我是匿名函数')
}

上面代码中第二个函数表示的就是一个最简单的匿名函数,也没有参数。重点的是,它没办法调用运行的,因为它连名字都没有,怎么调?所以如果我们需要使用它,我们可以这么做:

1
2
3
4
5
var who = function(){
console.log('我是匿名函数')
}

who();

即把该匿名函数赋值给一个变量,然后让变量执行就可以了。题外话,我们这里可不可以只写who,不加那个括号,像这样:

1
2
3
4
5
var who = function(){
console.log('我是匿名函数')
}

who

当然不行,js会报错,这样相当于who只是指向了函数的内存地址,单独使用没什么意义,把它console出来也是一个[Function],而我们要执行它,就像指针解引用一样加*一样的,给它加上()让它执行。

撤回来再看,但是这样的话感觉上跟正常函数的调用没什么两样,于是这里又引出了自执行的概念,我们可以把who的部分用那一堆匿名函数块给替换掉看行不行,像这样:

1
2
3
function(){
console.log('我是匿名函数')
}();

很遗憾,上面的js写法会报语言错误,原因就在于Javascript解析器在解析全局的function或者函数内部function这个关键字的时候,默认会把大括号解析成function声明,而不是function表达式。所以,我们还需要把前面这部分转成表达式,怎么转?加上括号就可以:

1
2
3
(function(){
console.log('我是匿名函数')
})();

运行成功打印‘我是匿名函数’,所以总结出来,它的格式就是(匿名函数)(),当然第二个括号里面可以带参数,比如我们要构造一个带参数的匿名函数,就像本篇开篇那样:

1
(function(name){console.log(name)})('fengyun');

我们说一般而言,匿名函数一般都跟闭包搭着使用,好基友一般。这里提到的闭包等以后再做学习笔记吧~