美文网首页
从IIFE提一下事件循环

从IIFE提一下事件循环

作者: 夜舞暗澜_3ea2 | 来源:发表于2018-05-17 14:58 被阅读0次

立即执行函数表达式是什么?有什么作用?

  1. 首先,JS中每个函数在被调用时都会创建一个执行上下文,在该函数内部定义的变量和函数只能在该函数内部被使用(闭包)。这样,虽然JS中没有明确的私有变量定义,我们也可以创建一些私有变量。
  2. 其次,函数也可以使用自己上级作用域中定义的变量。
  3. 立即执行函数(IIFE)。顾名思义,就是创建后立即自动执行的函数。这种函数既可以是具名的,也可以是匿名的。
  4. 结合以上,立即执行函数可以配合闭包保存变量状态。
    示例:
function loop() {
  for (var i = 0; i < 10; i++) {
    setTimeout(() => console.log(i), 100)
  }
}
loop()
// 10 10 10 10 10 10 10 10 10 10

先同步再异步,变量 i 不会被保存,所以输出10次10。

function loop1() {
  for (var i = 0; i < 10; i++) {
    (function (n) {setTimeout(() => { console.log(n) }, 100)}(i))
  }
}
loop1()

变量 i 的状态被保存再传入,每次输出都是当时的状态而不是同步结束后的状态。输出0 1 2 3 4 5 6 7 8 9。

另一个问题:为什么要用增加监听事件的例子讲IIFE?

讲解IIFE时,有时会遇到这个例子:

var elems = document.getElementsByTagName( 'a' );

for ( var i = 0; i < elems.length; i++ ) {

  elems[ i ].addEventListener( 'click', function(e){
    e.preventDefault();
    alert( 'I am link #' + i );
  }, 'false' );

}

在这个例子中,因为i不会被锁定,我们所有的事件监听其实都加给了elems[elems.length],但是elems[elems.length]又是不存在的,所以失败。
我们期望的运行结果应该是这个代码:

var elems = document.getElementsByTagName( 'a' );

for ( var i = 0; i < elems.length; i++ ) {

  (function( lockedInIndex ){

    elems[ i ].addEventListener( 'click', function(e){
      e.preventDefault();
      alert( 'I am link #' + lockedInIndex );
    }, 'false' );

  })( i );

}

用lockedInIndex锁住i的值,才会加给elems中的每一个对象。
所以我遇上了另一个问题:

为什么addEventListener是异步操作?

简单说,异步操作就是:

  1. 从主线程角度说:主线程将任务丢给其他任务线程,然后去做自己的事(同步操作),空闲下来回去从头看消息队列,如果遇到任务线程的完成通知,就执行对应的回调函数。
  2. 从任务线程角度说:任务线程接到一个任务就去完成,做完了就在消息队列末尾加入一条消息。
  3. 所以,消息队列中的每条消息实际上都对应着一个事件。

事件中还有很常见的一个类型:DOM事件
addEventListener发起了一个异步过程。事件触发时,异步任务完成,任务线程将事件回调函数封装在消息中放到消息队列中,等待主线程执行。

所有异步过程都可以用事件来描述。

参考文章

相关文章

  • 从IIFE提一下事件循环

    立即执行函数表达式是什么?有什么作用? 首先,JS中每个函数在被调用时都会创建一个执行上下文,在该函数内部定义的变...

  • 探索未知种族之osg类生物---呼吸分解之事件循环一

    事件循环和更新循环 终于到了我们嘴里经常念叨的事件循环、更新循环以及渲染循环了。首先我们来区分一下事件循环和渲染循...

  • 9. IIFE

    参考地址: IIFE - 中文; IIFE - 英文 IIFE(Immediately Invoked Funct...

  • JavaScript-事件循环

    参考JavaScript运行机制之事件循环(Event Loop)详解 从setTimeout说事件循环模型 单...

  • JS之闭包与IIFE

    本篇文章主要讨论了: JavaScript引擎 全局对象 闭包 循环 + 闭包 IIFE + 闭包 1.JavaS...

  • Python 异步: 什么是事件循环 ?(6)

    asyncio 程序的核心是事件循环。在本节中,我们将花点时间看一下 asyncio 事件循环。 1. 什么是 A...

  • 从 setTimeout 到事件循环

    回想起第一次使用 setTimeout 函数的时候,设置的回调函数并不是立即执行,而是过了一段定义好的时间之后才执...

  • 知识点

    ...语法 反转 Event Loop(事件循环) 主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个...

  • JavaScript 相关概念

    IIFE IIFE:Immediately-Invoked Function Expression. 匿名函数自调...

  • 金融的逻辑18

    从暴风事件我们来总结几个教训。我们先不从暴风事件中暴露的问题提这件事,我们从投资的角度上来看一下这个问题。其实暴风...

网友评论

      本文标题:从IIFE提一下事件循环

      本文链接:https://www.haomeiwen.com/subject/pfhbdftx.html