为什么要有js立即执行函数,存在的意义是什么

JavaScript024

为什么要有js立即执行函数,存在的意义是什么,第1张

立即执行函数可以避免函数内的变量暴露在全局环境下,避免全局变量的污染。

这种模式是非常有用的,因为它为你初始化代码提供了一个作用域的沙箱;

考虑一下下面这种常见的场景:

你的代码在页面代码加载完成之后,不得不执行一些设置工作,比如附加时间处理器,创建对象等等,

所有的这些工作只需要执行一次,所以没有理由创建一个可复用的命名的函数,

但这些代码也需要一些临时的变量,但初始化过程结束后,就再也不会被用到了,

所以将这些变量作为全局变量不是个好主意,所以我们需要立即执行函数——去将我们所有的代码包裹在它的局部作用域中,不会让任何变量泄露成全局变量;

其实不要被“函数表达式”的函数两字束缚了,其实就是“表达式”,这样一来就会好理解了。在表达式的前面加个逻辑运算符(比如!取反)或数学运算符(比如+),js就会认为你是要获取表达式的值,这样它就会去运行这个表达式,这样函数就会被执行了。比如说有下面这个函数声明:

function abc(){return true}

那么执行 !abc() 时js就会先去调用abc函数,然后再把返回值取反,这个好理解吧?

而现在把abc直接替换为匿名函数:

!function(){return true}()

js也一样会把!后面的部分当作一个表达式去运行,然后把取回的值进行取反,这个过程中匿名函数就会自动运行了。

其实 (function(){})()和 (function(){}()能够自执行的原理也是一样的,我加黑的那对括号其实也是运算符(就好比小学数学中的 (2+3)×4 中的括号),这样js就会把括号里的部分当作表达式来处理了。

所以,说到底函数的自执行其实并不是js的有意为之,而是一种无心插柳的行为,说是旁门左道也不为过,但它确实可以帮我们实现一些特殊的要求,所以就慢慢变成一种正经用法了。

没什么区别吧,都是隐式声明一个函数并调用。

优势知道一点,就是隐式函数里面的参数不会与其它框架的全局变量冲突。

比如,在隐式函数里面定义一个变量var a

而你项目里面可能有其它地方会定义一个全局变量var a

如果不用这中方式,那会干扰用到这个全局变量的代码