- 従来の function で起きる this 問題
- アロー関数が this を束縛しない仕組み
- メソッド定義での注意点
- イベント・コールバック・クラスでの使い分け
「thisの振る舞いがいまいち分からない…」
「アロー関数は使ってるけど、従来の関数と何が違うんだろう?」
「bindって結局いつ使えばいいの?」
今回は、コールバック関数でよく使用するアロー関数と、混乱しがちなthisの振る舞いについて、実践的に解説していきます。
現場で困ったりシリーズとして、アロー関数についてガッツリまとめた記事は以下になります。
本記事はthisの振る舞いについて焦点を当てています。

thisの混乱は、ほぼ「誰がthisを決めるか」の違いです。従来のfunctionは”呼ばれ方”で変わり、アロー関数は”書かれた場所”で固定される。この一点を押さえると、bindが要らなくなる場面がぐっと増えますよ。
記事を書いている人

R(アール)
Web制作の現場で17年(現役進行中)。精密栄養カウンセラー。
個人開発をアプリ6本並行しながら、AIと「作る・届ける」を実験しています。
うまくいったことも、月収2,000円みたいな冴えない数字も、隠さず公開中。
教える人ではなく、少し先で転んで戻ってきた人として、あなたと同じ目線で現在地を観測していけたらと思います。
従来のfunction定義とthisの問題
まず、従来の関数定義での問題を見てみましょう:
// jQuery時代によくあるコード
var Counter = {
count: 0,
button: $('#button'),
setup: function() {
// this を変数に保存
var self = this;
this.button.click(function() {
self.count++; // 直接thisは使えない
console.log(self.count);
});
}
};この書き方の問題点:
selfやthatなどの変数が必要- thisの参照が分かりにくい
- コードが冗長になる
アロー関数による解決
// モダンな書き方
const Counter = {
count: 0,
button: document.querySelector('#button'),
setup() {
this.button.addEventListener('click', () => {
this.count++; // thisが自動的に保持される
console.log(this.count);
});
}
};アロー関数の特徴:
- レキシカルスコープでthisを継承
- 自身のthisを持たない
- より簡潔な構文
従来の関数とアロー関数の違い
1. thisの束縛
setTimeoutの中で this.value を出すと undefined になるの、何回やってもハマります……。

従来の function は呼ばれた瞬間に this が決まるので、setTimeout から呼ばれると this が別物になるんです。アロー関数なら”書いた場所”の this をそのまま持つので、undefined になりません。下の Traditional と Modern を見比べると、その差が一目で分かりますよ。
// 従来の関数
function Traditional() {
this.value = 42;
this.getValue = function() {
return this.value;
};
this.delayed = function() {
setTimeout(function() {
console.log(this.value); // undefined
}, 1000);
};
}
// アロー関数
function Modern() {
this.value = 42;
this.getValue = () => {
return this.value; // 42
};
this.delayed = function() {
setTimeout(() => {
console.log(this.value); // 42
}, 1000);
};
}ポイント:
- 従来の関数は呼び出し方によってthisが変わる
- アロー関数は定義時のスコープのthisを保持
2. メソッド定義での注意点
const obj = {
name: 'Example',
// 従来の方法(推奨)
normalMethod() {
return this.name;
},
// アロー関数(非推奨)
arrowMethod: () => {
return this.name; // undefined
}
};使い分けのポイント:
- オブジェクトのメソッドは通常の関数で定義
- コールバックはアロー関数を使用
アロー関数への実践的なリファクタリング例
イベントハンドラ
// Before: jQuery
class UserList {
constructor() {
this.users = [];
var self = this;
$('#addUser').click(function() {
var name = $('#name').val();
self.addUser(name);
});
}
addUser(name) {
this.users.push(name);
this.render();
}
}
// After: Modern JavaScript
class UserList {
constructor() {
this.users = [];
document.querySelector('#addUser')
.addEventListener('click', () => {
const name = document.querySelector('#name').value;
this.addUser(name);
});
}
addUser(name) {
this.users.push(name);
this.render();
}
}配列操作のコールバック
// Before
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(function(num) {
return num * 2;
});
const filtered = numbers.filter(function(num) {
return num > 2;
});
// After
const doubled = numbers.map(num => num * 2);
const filtered = numbers.filter(num => num > 2);非同期処理
// Before
function loadData() {
var self = this;
fetch('/api/data')
.then(function(response) {
return response.json();
})
.then(function(data) {
self.processData(data);
})
.catch(function(error) {
self.handleError(error);
});
}
// After
function loadData() {
fetch('/api/data')
.then(response => response.json())
.then(data => this.processData(data))
.catch(error => this.handleError(error));
}アロー関数とfunctionの高度な使い分け
クラスメソッドでの利用
class DataHandler {
constructor(data) {
this.data = data;
}
// インスタンスメソッド: 通常の関数
process() {
return this.data;
}
// イベントハンドラ: アロー関数
handleClick = () => {
this.process();
}
// 通常のメソッド + bind
handleSubmit() {
this.process();
}
}
const handler = new DataHandler([1, 2, 3]);
button.addEventListener('click', handler.handleClick); // OK
form.addEventListener('submit', handler.handleSubmit.bind(handler)); // OK即時実行関数での使用
// Before: IIFE
(function() {
var privateVar = 'secret';
// ...
})();
// After: アロー関数
(() => {
const privateVar = 'secret';
// ...
})();まとめ
アロー関数を適切に使用することで:
- thisの管理が簡単に
- コードがより簡潔に
- コールバックの意図が明確に
- メンテナンス性が向上
次回は「テンプレートリテラルでHTML生成を最適化」について解説し、より洗練されたテンプレート処理を学んでいきましょう。
そして、アロー関数を使えること自体がゴールではありません。大事なのは、自分のコードで「どこで this が思った通りに動かなくなるか」を観測することです。コールバックの中なのか、イベントハンドラなのか、setTimeout の中なのか——this がズレる場所には自分のクセが出ます。エラーが出た瞬間に「今この this は誰を指している?」と観測する習慣がつくと、関数の使い分けが自然と体に入ってきます。
あわせて読みたい
📚 JavaScript モダン構文&実践の全体像は JavaScript モダン構文&実践 完全リファレンス でシリーズ全17記事を体系的に整理しています。
📚 シリーズ全体を見る: JavaScriptクラスの実践パターン(このシリーズの pillar 記事)
「自分の強みは何か」が、見えなくなる時期があります。
診断を受けても、本を読んでも、「結局どう動けばいいか」が分からない。考えるほど止まる。これは個人クリエイターによくある状態です。
個人開発8本、月収2,000円。Web制作17年のクリエイターが、AI と「作る」「届ける」を honest に実験している過程をメルマガで公開しています。「観測する」生き方の実践ログです。
登録特典:「AI時代に取り残されないための構造整理シート」(PDF 12p / 5ステップ)― スキル棚卸しから、自分のポジション設計まで。

