아시겠지만 set Timeout의 비밀.

4959 단어
타이머setTimeout는 우리가 자주 사용하는 것으로 지정된 밀리초수 후에 함수나 계산 표현식을 호출하는 데 사용된다.
문법: setTimeout(code, millisec, args);주의: 코드가 문자열이면 실행 eval() 방법으로 코드를 실행하는 것과 같습니다.
물론 이 글은 어떻게 쓰는지 알려줄 뿐만 아니라, 어떻게 집행하는지 이해한다.
1. setTimeout 원리
먼저 코드 세그먼트를 살펴보겠습니다.
var end = 0; 
setTimeout(function() {  console.log(new Date() - start); }, 500); 
while (new Date() - start <= 1000) {}```

       ,     `setTimeout`   ,     500  。

           : 500

           ,        (           ,      1000  ):
![setTimeout](http://upload-images.jianshu.io/upload_images/621214-f3001fbb9989ccde?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

     ?    ,     JavaScript       。    ,      ,           JavaScript  ,            。

         JavaScript。

           ,                 ,               :JavaScript    ,GUI    ,         。

- `JavaScript  `             ,JavaScript                 ,      ,              JavaScript     JavaScript  。

- `GUI    `         ,       (Repaint)           (Reflow) ,       。     ,GUI     JavaScript      , JavaScript     GUI      ,GUI              JavaScript          。

- `      `,         ,                  ,  JavaScript     。       JavaScript           setTimeout、                   、Ajax     ,   JavaScript      ,            JavaScript    (                          )。

   ,             :

```var start = new Date();
 var end = 0;
 setTimeout(function() {  console.log(new Date() - start); }, 500);
 while (new Date() - start <= 1000) {}```

  `setTimeout`      500  ,    `while`     ,         1000   ,    while  ,    , 1000    ,while       JavaScript  。    ,      while ,        ,          setTimeout。

   ,       ,`setTimeout`              (       )         ,                。    javascript       ,               。

  javascript                ,                      ,        ,              。

**2、setTimeout    “0”**

            :

```setTimeout(function(){ // statement}, 0);```

           。           ,    ,             ,    setTimeout         ,            ,              setTimeout     ,         setTimeout        0,             。

            ,IE8    IE       15.6ms。  ,  HTML5   ,         (Chrome、ie9+ ),              4  ,       ,      ,   2010               。

   ,      `setTimeout(fn,0)`    ,         ,     “    ”     ,                 。

 `setTimeout(fn, 0)`      ?                    !                    ,   setTimeout         。

          0s   ,             ,       ,      。

            :

```document.querySelector('#one input').onkeydown = function() {  
     document.querySelector('#one span').innerHTML = this.value;
 }; 
document.querySelector('#second input').onkeydown = function() {    
     setTimeout(function() {  
         document.querySelector('#second span').innerHTML = document.querySelector('#second input').value; }, 0);
}; ```

`  :[  ](http://ghmagical.com/iframe/modal/code/:javascript:setTimeout)

            ,       setTimeout              ,   setTimeout             。

      ?

          ,JavaScript        keydown        ,         value  ,            ,         ,   value (  keypress )          ,      keydown                  value ,    setTimeout(fn, 0),     value        ,     value    ,            。

   setTimeout  ,     :`onkeydown => onkeypress => onkeyup

`  setTimeout  ,     :`onkeydown => onkeypress => function => onkeyup`

        `keyup`   `keydown`,       ,      ,`keyup`     。

   ,keydown、keypress、keyup     :

```keydown
keypress
keydown
keypress
...
keyup```

    keyup      ,      keyup      。

      `setImmediate()`   `setTimeout(fn,0)`:

```if (!window.setImmediate) {  
    window.setImmediate = function(func, args){  
      return window.setTimeout(func, 0, args);  
   };  
  window.clearImmediate = window.clearTimeout;
 }```

setImmediate()`                          ,              ,           ,        func,           ,         。

  :    IE10     ,  , Nodejs         。

**3、setTimeout     ****

3.1 setTimeout      this**

  setTimeout()        window      ,           this     window  ,          。

    :

```var a = 1; 
var obj = {  
a: 2, 
 test: function() {  setTimeout(function(){  console.log(this.a);  }, 0);  
} 
}; 
obj.test(); // 1```

          bind()     setTimeout      this

```var a = 1; 
var obj = { 
 a: 2, 
 test: function() {  
setTimeout(function(){  
console.log(this.a);  
}.bind(this), 0);  
}
 }; 
obj.test(); // 2```

    :[JS  call、apply、bind  ](http://ghmagical.com/article/page/id/UPLfoGI9vJ91)

**3.2 setTimeout      **

     ,setTimeout               ,          (    ,         。 IE,FireFox ,             ,100ms  ,            ,Safari,chrome,opera   10ms  。)

  ,setTimeout         、     ....,       ?            (    )     。

```setTimeout(function(a, b){  
console.log(a); // 3 
console.log(b); // 4},0, 3, 4);```

    :[      setTimeout  ](http://ghmagical.com/article/page/id/H61NOVU0RZ9Y)

         ,           !

좋은 웹페이지 즐겨찾기