問題
- とりあえず、コールバック関数の中でthisを使うのは注意
- コールバック外で定義されてるthisとは違うから
- ブラウザJavaScriptで、setTimeoutコールバックで参照できる
thisはwindow - node.jsに
windowって無いんじゃなかったっけ? - node.jsのsetTimeout内の
thisって何? ←イマココ
やってみよう
そうしよう
% 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 }
ほうほう
調べてみよう
そうしよう
これやな
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な備忘録として