Simple Note

立即执行函数

2015.11.01

之前写的全删了。看书的时候经常会这样,接触新概念的时候费尽心思理解了,赶紧写点心得纪念一下,一个礼拜后回头一看,这点东西也值得写?

立即执行函数就是一个让引擎把函数声明识别成函数表达式的小技巧,对那些只需要运行一次的函数来说,先定义再执行的做法太罗嗦了,于是开发者们琢磨着能不能定义的时候顺便把它执行了,反正函数执行就是函数名加个括号嘛。

一开始也许有人尝试过下面这种写法:

function (){}()

然而并不能执行,这是错误的写法,引擎认为函数声明后面不应该有括号,执行上面的语句会出现Uncaught SyntaxError: Unexpected token的错误。

先驱们动了动脑子,关键在于要让引擎认为上面的语句是一个表达式!

表达式有下面几种:

  • 算术表达式
  • 字符串表达式
  • 关系(比较)表达式
  • 逻辑表达式

挨个试试,我们先往语句中加点运算符试试?

+ function (){}()

多了个加号...虽然看起来很奇怪,但它确实可以运行了,再试试除了加号以外的运算符:

- function (){}();
1 * function (){}();
1 / function (){}();
1 % function (){}();

实测全都可以,说明只要想办法把包含函数声明的语句转化成表达式即可。可是,上面的语句都会产生副作用,亲手在浏览器的控制台中敲一下就会知道,运算符都要返回结果,而这里函数语句并不是一个可以用来计算算术结果的东西,结果就是会额外返回一个NaN,其实这也没什么,毕竟我们的目的达到了,可是先驱们接受不了这个不完美的办法,又动了动脑子,有没有不返回值的运算符呢?

当然有,那就是括号:

(function (){}());
function (){}()();

两种加括号的方式都可以,现在,函数既可以在定义的同时立刻执行,也不会产生额外的输出了,问题解决!这就是我们现在经常看到的立即执行函数的写法。

Comments
Write a Comment