node.jsのsetTimeout内の`this`って何?【node.js】【setTimeout】
問題
- とりあえず、コールバック関数の中で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な備忘録として