ES6とは
ES2015というJavaScriptのバージョンのことです。
現在のモダン開発の殆どは、このバージョンに倣っています。
詳細の概要はこちらでご確認ください。
thisについて
以下のコードではthisの使い方について説明します。
例1
value = 'global value';
function printValue(){
console.log(this.value); //上記のvalueキーの値を指している
}
let obj = {
value: 'obj value',
func: printValue
} //新たにobjオブジェクトを作成し、valueに'obj value'を格納
let obj2 = {
value: 'obj2 value',
func: printValue
}//obj2を作成し、valueに'obj2 value'を格納
obj.func();
obj2.func();
/*
"obj value"
"obj2 value"
*/
例1デモ
printValue関数にconsole.log()をするように記述します。
ここで言う、this.valueは直前で変数定義したvalueを指します。
**console.log(this.param);**をオブジェクト定義後に単体で記述するとvalueの値('global value')が直接出力されます。
objとojb2オブジェクトでの定義は、各キー(valueとkey)に値を代入しています。
それぞれのオブジェクトを呼び出すには、**obj.func();**のように「valueキー.funcキー()」になります。
オブジェクトを呼び出すと、初めに定義したfunctionが呼ばれるため、console.log()されます。
その時の処理結果は、objとojb2オブジェクトで代入された値となります。
アロー関数(ES6以降)のthis
例2と似たようなコードにはなりますが、printValue関数を定義する際にアロー関数となっています。
変更点はfunctionがアロー関数に変更されただけになりますが、処理結果はそれぞれ一番始めに定義した、valueオブジェクトの値になります。
例2
value = 'global value';
let printValue = () => { //アロー関数
console.log(this.value); //上記の変数valueの値を指している
}
let obj = {
value: 'obj value',
func: printValue
} //新たにobjオブジェクトを作成し、valueに'obj value'を格納
let obj2 = {
value: 'obj2 value',
func: printValue
}//obj2を作成し、valueに'obj2 value'を格納
obj.func();
obj2.func();
/*
"global value"
"global value"
*/
MDNのカンファレンスの記載では、
アロー関数式 は、その名のとおり矢印を使って記述し、function 式より短い構文で同様な内容を記述することができます。なおthis, arguments, super, new.target を束縛しません。
とありますが、実行した結果から判断すると
例1のfunction・・・valueは再代入可能なためfunctionで定義される関数はthisを束縛しない
例2のvalue・・・valueは再代入が不可能なためアロー関数で定義される関数はthisを束縛する
ということになります。
最近のJavaScriptではES6が多く使われているので、thisを使う際はこの違いを把握する必要があります。
感想
ここ最近、【転職して痛感…】でもJavaScriptの基礎についてアウトプットしていますが、まだまだ知らないことが多すぎる。。。
がんばるじょ!