찾다
웹 프론트엔드JS 튜토리얼인터뷰: JavaScript에서 setTimeout이 정확히 무엇인가요?

이 기사의 내용은 인터뷰에 관한 것입니다. JavaScript에서 setTimeout이란 무엇입니까? , 특정 참조 가치가 있으므로 도움이 필요한 친구가 참조할 수 있으므로 도움이 되기를 바랍니다.

테스트 문제를 작성할 때 setTimeout 문제가 자주 발생합니다. 이것이 타이머 설정이라는 것만 알지만 일반적으로 조사의 초점은 메소드에 포함된 타이머, 타이머에 인쇄 및 메소드에 인쇄됩니다. .. 아마도 제가 말한 것이 실행 순서 문제에 대해 조금 이해하기 어려울 수도 있습니다. setTimeout이 무엇인지 살펴보겠습니다.

타이머 소개

js의 타이머란 무엇인가요?

Period 타이머: setInterval()

소개

setInterval()은 지정된 기간에 따라 타이머를 호출하는 메서드입니다. 메서드는 clearInterval() 또는 창을 사용하여 타이머를 중지할 때까지 계속 타이머를 호출합니다. 폐쇄되었습니다.

Syntax

setInterval(code,millisec,lang)

  • code: 실행할 메소드 본문(필수)

  • millisec: 실행할 시간(밀리초, 5000으로 설정된 경우 단위는 밀리초) 즉, 5초마다 실행됨) (필수)

  • lang: 사용된 언어를 참조합니다. (선택)

Instance

setInterval



<input>
<script>
//每隔1秒执行一次clock方法
var int=self.setInterval("clock()",1000);
function clock()
{
var d=new Date();
var t=d.toLocaleTimeString();
document.getElementById("clock").value=t;
}
</script>
<!-- 设置一个按钮,点击按钮即停止定时器 -->
<button>停止</button>

Rendering을 통해 시계 효과 달성:

인터뷰: JavaScript에서 setTimeout이 정확히 무엇인가요?

'일회성' 타이머: setTimeout()

Introduction

이 타이머는 이름에서 알 수 있듯이 한 번만 실행되며 setInterval()과의 차이점은 바로 여기에 있습니다. ) 타이머를 취소하려면clearInterval 메소드만 사용해야 합니다

Syntax

setTimeout(code, millisec,lang) ps: 각 매개변수의 의미는 setInterval()

Example과 같습니다.

버튼을 클릭하면 3 초 후에 "hello"가 나타납니다. , 매번 타이머는 타이머를 취소하여 해당 카운터를 얻을 수 있도록 id를 반환합니다.

인터뷰: JavaScript에서 setTimeout이 정확히 무엇인가요?clearInterval(id)

clearTimeout(id)

Instance

nbsp;html>


<meta>
<title>菜鸟教程(runoob.com)</title>



<p>点击按钮,在等待 3 秒后弹出 "Hello"。</p>
<button>点我</button>

<script>
function myFunction()
{
    setTimeout(function(){alert("Hello")},3000);
}
</script>


    setTimeout의 실행 순서는 어떻게 되나요?
  • 우리 모두는 js가 단일 스레드 언어이고 모든 다중 스레드는 환상이며 단일 스레드에 의해 시뮬레이션된다는 것을 알고 있습니다. 브라우저는 다중 프로세스이며 브라우저의 핵심(렌더링 프로세스)은 다중 스레드입니다.

    렌더링 프로세스에는 js 엔진 스레드가 있습니다. 이 스레드는 JavaScript 스크립트(예: Chrome의 V8 엔진)를 처리하는 데 사용되며, 이 때문에 우리는 항상 JavaScript가 단일 스레드라고 말했습니다.
  • 그렇다면 질문은 js가 단일 스레드이므로 비동기 setTimeout은 어떻게 구현됩니까? js가 스크립트를 구문 분석할 때 작업을 동기 작업과 비동기 작업의 두 가지 범주로 나누고 구문 분석 중에 실행을 위해 서로 다른 위치에 입력합니다.
  • 동기 작업: js 엔진 스레드가 관리되는 메인 스레드의 실행 스택에 들어가서 순서대로 실행됩니다.
비동기 작업: 이벤트 테이블에 들어가서 함수를 등록합니다. 콜백 함수의 조건이 충족되면 콜백 함수는 작업 큐인 이벤트 큐에 배치됩니다.

메인 스레드의 작업이 완료되면, 즉 실행 스택이 비어 있으면 작업 대기열로 이동하여 이벤트가 있는지 확인합니다. 실행되고 루프는 다음과 같이 계속됩니다. 이것이 이벤트 루프 메커니즘입니다. 다음 다이어그램을 참조하여 이해할 수 있습니다.



  • 아마도 이벤트 루프 메커니즘의 프로세스를 아직 이해하지 못할 수도 있습니다. 그래서 좀 더 명확하게 설명하겠습니다. 예를 들면 다음과 같습니다.

    //设置超时调用
    var timeoutId = setTimeout(function (){
        alert("hello World");
        },1000);
    //取消掉用的代码
    clearTimeout(timeoutId);
  • 실행 프로세스:
파싱 시작, 동기화 작업인 console.log 발생, 메인 스레드 진입, 직접 실행, 인쇄

; 아래로 내려가서 setTimeout이 발생하면 이벤트 테이블에 들어가서 콜백 함수를 등록하세요. 인터뷰: JavaScript에서 setTimeout이 정확히 무엇인가요?

더 아래로 내려가서 console.log를 만나면 직접 실행하고

end

;

  • 5s后,将回调函数放进Event Queue,此时执行栈刚好为空,主线程会去任务队列中取出这个回调函数,执行,打印setTimeout

  •   ps:

    • 第1,3步都是js引擎线程干的事情,主线程执行任务;

    • 第2步是渲染进程中的事件触发线程(专门管理任务队列的)管理;

    • 第4步是定时器线程控制的(也就是setTiemout和setInterval所在的进程),定时器线程专门用来控制什么时候将回调函数放进任务队列。

      如果看懂了上面的例子,就知道其实setTimeout的第二个参数其实并不能准确的控制多少秒后执行里面的函数,而是控制多少秒后将这个函数放进任务队列中;这样也就同样可以解释,为什么有时候明明设置的是2秒之后执行,却要等不止2秒(因为很有可能定时线程将回调函数放进任务队列后,主线程还在执行执行栈中的任务,需要执行栈中的任务全部执行完后才会去任务队列中取任务)。
      这样就会引发一个问题,我们知道setInterval是隔一定的时间执行一次,现在理解了原理后,就知道其实是隔一定的时间定时器线程将回调函数放进任务队列中。如果已经将回调函数放进任务队列,但是主线程正在执行一个非常耗时的任务,当这个任务执行完毕后,主线程去任务队列中取任务,这个时候,就会出现连续执行的情况,也就是说setInterval相当于失效了。

    setTimeout基础篇

      这一部分主要是针对在事件循环机制中setTimeout调顺序进行举例子,如果能够轻松的将例子看懂,就说明你是真的懂了事件循环机制的一部分,为什么说是一部分呢,因为还有一个宏任务和微任务的知识点还没有涉及到,后面的进阶篇就会涉及到啦!

    例1

      console.log('start')
      setTimeout(function(){
        console.log('setTimeout')
      },0)
      console.log('end')

    打印结果:(如果前面看懂了的同学应该就会明白为什么)

    인터뷰: JavaScript에서 setTimeout이 정확히 무엇인가요?

    分析:其实和上面那个例子时一样的,只是这个0会给我们一种会立即执行的假象,这个0是说明定时器线程会立即将回调函数放进任务队列而已,主线程还是会将执行栈中的两个同步任务执行完成后再去任务队列中取任务,所以执行顺序和这里的秒数无关。而且即使执行栈为空,也不会0秒就执行,因为HTML的标准规定,setTimeout不超过4ms按照4ms来计算。

    例2

      console.log('start')
      setTimeout(function(){
        console.log('setTimeout')
      }(),0)
      console.log('end')

    打印结果:(仔细对比与例1的区别)

    인터뷰: JavaScript에서 setTimeout이 정확히 무엇인가요?

    分析:细心的同学会发现,我将回调函数改成了立即执行函数,就改变了执行的顺序。首先我们需要明确的是setTimeout的第一个参数是指函数的返回值,这里回调函数为立即执行函数时,返回值就是undefined了,所以会直接执行立即执行函数,也就是立即打印setTimeout,而真正的setTimeout函数就相当于没起作用。

    例3

    setTimeout(() => {
       console.log('setTimeout')
    },3000)
    
    sleep(10000000)//伪代码,表示这个函数要执行很久很久

    打印结果:
    这个结果不说也知道,肯定会打印出setTimeout的,但是重点却不在这儿~
    重点在于,这个setTimeout是隔很久很久打印出来的,远远超过了3秒,这个例子也是很明确的体现了js的事件循环机制。

    setTimeout进阶篇

      这一部分相对于基础篇,加上了作用域以及其他也是比较难以理解的东西,可能还需要补充一些其他知识才会明白,我会尽量讲清楚,也会把我看的参考文章放在下面。
      受到一篇文章的启发,我们以循序渐进的方式来阐述

    难度:O

    问题:以下代码输出的是什么?

    for(var i = 0;i <p><strong>答案:</strong>没错,你没有看错,就是一个简单的循环,就像你想的那样,连续输出0,1,2,3,4</p><h3 id="难度-OO">难度:OO</h3><p><strong>问题:</strong>以下代码输出的是什么?如果把时间改为1000*i输出的又是什么?</p><pre class="brush:php;toolbar:false">for(var i = 0;i <p><strong>答案:</strong><br>  时间为1000时,1秒后会连续输出5个5;时间为1000*i时,会每隔一秒输出一个5,一共5个5<br><strong>分析:</strong><br>  由上面的事件循环机制我们知道,setTimeout是异步事件,会放在事件队列中等着主线程来执行,这个时候for循环中的i已经变成了5,由于定时器线程是在1秒后直接将5个setTimeout事件放进事件队列中,所以主线程在执行的时候就没有间隔了;当时间乘上一个i时,定时器会隔1秒将setTimeout事件放入队列,就会出现每隔一秒输出一个5的情况。</p><h3 id="难度-OOO">难度:OOO</h3><p><strong>问题:</strong>如果想输出0,1,2,3,4应该怎么改?<br><strong>分析:</strong><br>  出现上一题的情况主要是因为在setTimeout的回调函数中并没有保存每次循环i的值,最后执行的时候,得到的i就是最后更新的i了(即为5),所以要解决这个问题,思路是要在回调函数中保存每次for循环中的i值。</p><p><strong>解决方案1:</strong>使用es6中let代替var<br><strong>分析:</strong>let是es6中新增的内容,作用和var一样,都是用来定义变量,但是最大的差别就是let会形成块级作用域,在本例中,就是每次循环,都会产生一个作用域,在该作用域中的变量是一个固定值,下次i变化时不会对这个i产生影响,也就是达到了我们的目标。</p><pre class="brush:php;toolbar:false">for(let i = 0;i <p><strong>解决方案2:</strong>使用闭包<br><strong>分析:</strong>就是直接在setTimeout函数的外面套一层立即执行函数,并将i值作为参数传到匿名函数中(这里的匿名函数也可以是命名函数),然后由于setTimeout中回调函数用到了匿名函数中的i,就会形成闭包。</p><pre class="brush:php;toolbar:false">for(var i = 0;i <p><strong>延伸:</strong>将代码变成下面这样会输出什么?(去掉匿名函数中的i)<br><strong>分析:</strong>这里会输出5个5,也就是闭包没有起作用,根本原因是i并没有传进去,打印的还是最后的i</p><pre class="brush:php;toolbar:false">for (var i = 0; i <p><strong>解决方案3:</strong>将回调函数改成立即执行函数<br><strong>分析:</strong>这个解决方案其实不是太好,如果要求是每隔1秒输出一个数字,这个方法就不适用了;这个方法会立马输出0,1,2,3,4,原因结合基础篇应该就明白了</p><pre class="brush:php;toolbar:false">for (var i = 0; i <h3 id="难度-OOOO">难度:OOOO</h3><p>  这一部分会涉及到promise,事件循环机制,宏任务和微任务的内容,算是比较难的部分了,如果觉得比较难看懂,最好先去补一下基础知识,我这里就简单介绍一下。</p><h4 id="promise对象">promise对象</h4><p>我这里就不详细讲了。</p><h4 id="宏任务和微任务">宏任务和微任务</h4>
    • 宏任务:可以理解成将代码块走一遍的过程,setTimeout和promise都是宏任务,现在不理解没关系,后面会通过例子帮助理解

    • 微任务:是在宏任务执行完成之后执行的,也是有相应的微任务队列存放微任务,比如promise中的then就是微任务

    인터뷰: JavaScript에서 setTimeout이 정확히 무엇인가요?

    问题:以下代码输出的是什么?

        setTimeout(function () {
          console.log(1)
        }, 0);
        new Promise(function executor(resolve) {
          console.log(2);
          for (var i = 0; i <p><strong>答案:</strong>(是不是很懵,为什么会是这样,下面看我的分析你就知道了)</p><p style="text-align: center;"><span class="img-wrap"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn//upload/image/617/114/318/1543217488584753.png?x-oss-process=image/resize,p_40" class="lazy" title="1543217488584753.png" alt="인터뷰: JavaScript에서 setTimeout이 정확히 무엇인가요?"></span></p><p><strong>分析:</strong></p><ol class=" list-paddingleft-2">
    <li><p>进入宏任务(从第一行到最后一行执行一遍的过程),碰到setTimeout,将setTimeout放进事件队列中;</p></li>
    <li><p>碰到promise,执行console,<strong>打印2</strong>;</p></li>
    <li><p>经过循环后,执行console,<strong>打印3</strong>;</p></li>
    <li><p>到了then,由于then是微任务,会在宏任务执行完成后执行,放进微任务队列;</p></li>
    <li><p>遇到console,<strong>打印5</strong>;</p></li>
    <li><p>至此,第一次的宏任务执行完成,接下来执行微任务队列中的then,<strong>打印4</strong>;</p></li>
    <li><p>现在执行栈中的任务都执行完了,现在就要去事件队列中取事件,此时执行setTimeout这个宏任务,<strong>打印1</strong>;</p></li>
    </ol><p><strong>宏任务微任务与同步事件异步事件的关系:</strong><br>  这些词都是用来描述事件的,只是从不同的角度来描述,就像是胖子矮子与男生女生之间的联系</p><p class="comments-box-content"><br></p><p>		</p>

    위 내용은 인터뷰: JavaScript에서 setTimeout이 정확히 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 segmentfault에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    Python vs. JavaScript : 학습 곡선 및 사용 편의성Python vs. JavaScript : 학습 곡선 및 사용 편의성Apr 16, 2025 am 12:12 AM

    Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

    Python vs. JavaScript : 커뮤니티, 라이브러리 및 리소스Python vs. JavaScript : 커뮤니티, 라이브러리 및 리소스Apr 15, 2025 am 12:16 AM

    Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

    C/C에서 JavaScript까지 : 모든 것이 어떻게 작동하는지C/C에서 JavaScript까지 : 모든 것이 어떻게 작동하는지Apr 14, 2025 am 12:05 AM

    C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

    JavaScript 엔진 : 구현 비교JavaScript 엔진 : 구현 비교Apr 13, 2025 am 12:05 AM

    각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

    브라우저 너머 : 실제 세계의 JavaScript브라우저 너머 : 실제 세계의 JavaScriptApr 12, 2025 am 12:06 AM

    실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

    Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Next.js (백엔드 통합)로 멀티 테넌트 SAAS 애플리케이션 구축Apr 11, 2025 am 08:23 AM

    일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

    Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Next.js (Frontend Integration)를 사용하여 멀티 테넌트 SaaS 응용 프로그램을 구축하는 방법Apr 11, 2025 am 08:22 AM

    이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

    JavaScript : 웹 언어의 다양성 탐색JavaScript : 웹 언어의 다양성 탐색Apr 11, 2025 am 12:01 AM

    JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 채팅 명령 및 사용 방법
    4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    VSCode Windows 64비트 다운로드

    VSCode Windows 64비트 다운로드

    Microsoft에서 출시한 강력한 무료 IDE 편집기

    DVWA

    DVWA

    DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

    SublimeText3 Linux 새 버전

    SublimeText3 Linux 새 버전

    SublimeText3 Linux 최신 버전

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    맨티스BT

    맨티스BT

    Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.