(一)不可不说的JS重点知识~立即执行函数

1,807 阅读3分钟

---不积跬步,无以至千里,不积小流,无以成江海。

(一)不可不说的JS重点知识~立即执行函数

(二)不可不说的JS重点知识~节流和防抖(测试小姐姐专题)

(三)不可不说的JS重点知识~递归和尾递归(测试小姐姐专题)

(四)不可不说的JS重点知识~闭包(测试小姐姐专题)

(五)javaScript重点知识~~~单例模式(测试小姐姐专题)

       小伙伴们好,以后和大家多分享一些接地气的知识点。这样的知识点,可以在工作学习中都可以用得到,然后总结成为自己的东西。这才是知识分享的最终目的。

       我们一起,每天进步一点。日积月累,有朝一日定会,厚积薄发。      

一、什么是立即执行函数?

      声明一个函数,并马上调用这个匿名函数就叫做立即执行函数;也可以说立即执行函数是一种语法,让你的函数在定义以后立即执行;

(function() {// 代码})();
**function(){…}**是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。
**立即执行函数**也可以理解为立即调用一个匿名函数。**立即执行函数**最常见的应用场景就是:将var变量的作用域限制于这个函数内,这样可以避免命名冲突。

二、立即执行函数的作用

  1. 不必为函数命名,避免了污染全局变量
  2. 立即执行函数内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量
  3. 封装变量
  4. 总而言之:立即执行函数会形成一个单独的作用域,我们可以封装一些临时变量或者局部变量,避免污染全局变量

三、立即执行函数的参数

  (
    function(j){//代码中可以使用j }
  )(i) 

如果立即执行函数中需要全局变量,全局变量会被作为一个参数传递给立即执行函数(上例中的i就是一个全局变量,i代表的是实参,j是i在立即执行函数中的形参)。

四、立即执行函数的返回值

像其他函数一样,立即执行函数也可以有返回值。除了可以返回基本类型值以外,立即执行函数也能返回任何类型的值,比如对象,函数。

 let result = (
     function(j){ 
         return function(j){console.log(j*j)} }
 )(i) 
 console.log(result(5));
 结果是:25

五、相关面试题

for(var i = 0 ;i<3;i++){
  setTimeout(
     function(){console.log(i)}
  )
}

 因为i是贯穿整个作用域的,setTimeout延迟执行,异步一定是在for运行完以后才打印console,此时i已经变成3了。

方法1:使用立即执行函数,给每个li创建一个独立的作用域,在立即执行函数执行的时候,i的值从0到2,对应三个立即执行函数,所以就能正常输出了。

for(var i = 0 ;i<3;i++){
  setTimeout(
     (
      function(){console.log(i)}
     )()
  )
}

**方法2:**使用ES6的块级作用域。

 for(let i = 0 ;i<3;i++){
  setTimeout(
       function(){
           console.log(i)
       }
  )
} 

沁园春·长沙

独立寒秋,湘江北去,橘子洲头。
看万山红遍,层林尽染;漫江碧透,百舸争流。
鹰击长空,鱼翔浅底,万类霜天竞自由。
怅寥廓,问苍茫大地,谁主沉浮?
携来百侣曾游。忆往昔峥嵘岁月稠。
恰同学少年,风华正茂;书生意气,挥斥方遒。
指点江山,激扬文字,粪土当年万户侯。曾记否,到中流击水,浪遏飞舟?