JSで意識すること
自分用のJS扱うときに意識することメモ
- 参照のコピーとthis
- list2
- list3
参照のコピーとthis
本文1
const person = { name: "Tom", hello: function() { console.log("Hello " + this.name) } } person.hello()
この場合、thisは呼び出しもとのpersonを指すことになる。 しかし、
const person = { name: "Tom", hello: function() { console.log("Hello " + this.name) } } const ref = person.hello ref();
とするとthisはwindowオブジェクトを指すようになる。 なぜならpersonオブジェクトのhelloメソッドの参照がrefに代入されて実行されただけだから。 この呼び出し元はpersonオブジェクトではなくwindowオブジェクトになる。
見出し1-1
見出し1-2
本文1-2
見出し1-3
本文1-3
非同期Promiseチェーン
function sleep(val) { return new Promise(function(resolve){ setTimeout(function() { console.log(val++); resolve(val); }, 1000) }); } sleep(0).then(function(val) { return sleep(val) } ).then(function(val) { return sleep(val) } ).then(function(val) { sleep(val); return val } ).then(function(val) { console.log("d") return sleep(val) }
上記のコードがどのような動きをするかというと一秒ごとにカウントが「1,2 3」 とコンソールに出力されるが3に時に33と3つ目のthenと4つ目のthenが同時に実行されてしまう。なぜなら3つ目のthenが即時にvalという値でresolveされたPromiseオブジェクトを返しているからである。1回目や2回目はpendingされた状態のPromiseオブジェクトが返され、そのオブジェクトは1秒後にresolveされfullfilledの状態となり後続のthenが実行される。thenの中ではreturn "AAA"と書いていても暗黙的にAAAでresolveされたfullfilledなPromiseオブジェクトに暗黙的に変換されていることが大切。thenが返すのは必ずPromiseオブジェクトになっている。
見出し2-1
本文2
見出し3
本文3
見出し3-1
本文3