DRYな備忘録

Don't Repeat Yourself.

node.jsのsetTimeout内の`this`って何?【node.js】【setTimeout】

問題

  1. とりあえず、コールバック関数の中でthisを使うのは注意
  2. コールバック外で定義されてるthisとは違うから
  3. ブラウザJavaScriptで、setTimeoutコールバックで参照できるthiswindow
  4. node.jsにwindowって無いんじゃなかったっけ?
  5. node.jsのsetTimeout内のthisって何? ←イマココ

f:id:otiai10:20131230204539j:plain

やってみよう

そうしよう

% cat sampleSetTimeout.js

setTimeout(function(){
    console.log("setTimeout内の`this` is 何", this);
},0);
console.log("ここの`this` is 何", this);

% node sampleSetTimeout.js

ここの`this` is 何 {}
setTimeout内の`this` is 何 { _idleTimeout: 1,
  _idlePrev: null,
  _idleNext: null,
  _idleStart: 441405243,
  _onTimeout: [Function],
  _repeat: false }

ほうほう

調べてみよう

そうしよう

これやな

setTimeout - Node.js

Returns a timeoutId for possible use with clearTimeout().

「関数の返り値はtimeoutIdだお( ^ω^)」とのこと

( ;^ω^)いや、僕が知りたいのはこーるばっく内で参照できるthisなんだお...

もうやってみるしかないじゃない 9ξ(✿;ω;)ξ

返り値も表示してみた

var returnsOfSetTimeout = setTimeout(function(){
    console.log("setTimeout内の`this` is 何", this);
},0);
console.log("ここの`this` is 何", this);
console.log("setTimeoutの返り値?", returnsOfSetTimeout);

けっか

ここの`this` is 何 {}
setTimeoutの返り値? { _idleTimeout: 1,
  _idlePrev:
   { '0': [Function: listOnTimeout],
     _idleNext: [Circular],
     _idlePrev: [Circular],
     msecs: 1 },
  _idleNext:
   { '0': [Function: listOnTimeout],
     _idleNext: [Circular],
     _idlePrev: [Circular],
     msecs: 1 },
  _idleStart: 441715864,
  _onTimeout: [Function],
  _repeat: false }
setTimeout内の`this` is 何 { _idleTimeout: 1,
  _idlePrev: null,
  _idleNext: null,
  _idleStart: 441715864,
  _onTimeout: [Function],
  _repeat: false }

ん、どうやらsetTimeout内のthis == 返り値(自分のtimeoutId)っぽい?内容の違いとしては、返り値ではまだこのtimeoutは発動してないから_idlePrev_idleNextがあるけど、setTimeout内ではすでに自分が発動してるので、nullになってる、って感じっぽい?

まとめ

node.jsで、setTimeoutのコールバック内で参照されるthisは、setしたtimeout自身のtimeoutIdである模様(模様)

DRYな備忘録として