JS函数之---立即执行函数(IIFE)

JavaScript025

JS函数之---立即执行函数(IIFE),第1张

Immediately-Invoked Function Expression(IIFE立即执行函数表达式)

可以让函数在创建后立即执行 必须是一个表达式

1、函数的定义方式一: 函数声明

2、函数的定义方式二: 函数表达式(匿名函数表达式、命名函数表达式)

1、错误写法 直接报错 js引擎看到function关键字会认定后面跟的是函数定义语句,此时后面如果直接加上()会被当做分组操作符,而分组操作符必须有表达式,所以此时报错

2、立即执行函数的正确写法,让js引擎认为这是一个表达式

1、立即执行函数不能再外面再被调用,执行完之后已经被立即销毁了。所以立即执行函数的函数名称可以省略, 统一使用匿名函数表达式

2、由于立即执行函数,执行完后就立即被销毁了 所以它可以创建一个独立的作用域,而且该作用域里面的变量,外面访问不到。因此就可以避免变量污染

正确输出写法:用立即执行函数将i作为参数传入,立即函数每次执行时,会把参数i的值复制一份。然后再创建函数作用域来执行函数

1、立即执行函数和闭包只是有一个共同有点就是都能减少全局变量的使用

2、立即执行函数只是函数的一种调用方式,声明完后立即调用,一般只能调用一次,调用完后会立即被销毁,不会占用内存,有自己的独立作用域,外部不能调用

3、闭包则主要是让外部函数可以访问内部函数的作用域,也减少了全局变量的使用,保证了内部变量的安全,但是被引用的内部变量不会被销毁,增大了内存消耗,使用不当会容易造成内存泄露

可参考: https://www.cnblogs.com/wenxuehai/p/10357274.html

functionn MyAutoRun(){//以下是您的函数的代码,请自行修改先!\x0d\x0aalert("函数自动执行哦!")} 下面,我们就针对上面的函数,让其在网页载入的时候自动运行! ①第一种方法 将如上代码改为: \x0d\x0afunctionn MyAutoRun(){//以下是您的函数的代码,请自行修改先!\x0d\x0aalert("函数自动执行哦!")}window.onload=MyAutoRun//仅需要加这一句\x0d\x0a ②第二种方法 修改网页的Body为: 或者改为: ③第三种方法 使用JS定时器来间断性的执行函数: setTimeout("MyAutoRun()",1000)//隔1000毫秒就执行一次MyAutoRun()函数 实现方法,将最上面的那JS函数,改为: \x0d\x0afunctionn MyAutoRun(){//以下是您的函数的代码,请自行修改先!\x0d\x0aalert("函数自动执行哦!")}setTimeout("MyAutoRun()",1000)//这样就行拉\x0d\x0a 其它的方法比较特殊,也不常用,通用性也不大,偶就不介绍了,拜拜!

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

function abc(){return true}

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

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

!function(){return true}()

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

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

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