JavaScriptのthisキーワードをちゃんと理解する
JavaScriptで「自分自身」にアクセスするthisキーワードについてきちんと理解していますか? 今回はthisキーワードに関してです。
前ページの解説
前ページのプログラムが正しく動作しなかった理由は、実は最初にお見せした例と全く変わりません(だから、前ページのバグをすぐに見つけられた方もいらっしゃるでしょう)。
問題は、shiraishi.init()内で行っているこの処理ですね。
button.onclick = this.hello;
この状態でボタンをクリックされると、onclickイベントハンドラ=hello()メソッドが実行されます。その際、hello()の中で用いている"this"はshiraishiオブジェクトではなく、ボタンのDOMオブジェクトになってしまいます。だから、this.nameが「buttonタグのname属性」を指してしまっていると言うわけです。
普通の関数中でthisを使うとどうなる?
最後に、thisに関してもう一つだけ簡単な実験をしておきましょう。
以下のコードを見てください。
<script type="text/javascript">
// トップレベルのコード中でthisを使用する
alert(this);
function init() {
// トップレベルに定義された関数内でthisを使用する
alert(this);
}
</script>
このコードで使われている二つのalert()は、どちらも[object Window]と表示されます。つまり、ブラウザのwindowオブジェクトですね。
この事実を正確に文章で表すなら、「トップレベルのプログラムコード/関数内でthisを利用すると、『グローバルオブジェクト』を指す」と言うことになります。
グローバルオブジェクトと言うのは、簡単に言うと「グローバルな変数/関数の置き場所となるオブジェクト」です。ブラウザ上のJavaScriptにおいてはwindowオブジェクトになりますし、その他の実行環境では違うものになることがあります。
まとめと次回予告
今回は、「this」キーワードについて掘り下げた解説を行いました。オブジェクト指向的なJavaScriptプログラミングを行う際には、今回お見せしたように、thisが指す対象を間違ってしまうことが多いので注意してください。
次回は、今回の知識を踏まえた上で、JavaScriptの関数に関連する事柄(call()/apply()、argumentsオブジェクトなど)を網羅したいと思います。
- 特集: JavaScriptのイロハ (19件)
- ホワイトペーパー
- 話題のタグ
文字にドロップシャドウの効果をつける--FirefoxとSafariのCSS対応
iPhoneにAdiumが載らない2つの理由
iPhone 3Gの節電術
マイクロソフトはIE 8で地雷を踏んだ?
マイクロソフト、Internet Explorer 8のベータ2をリリース
「iPhone」のパスコードロックに深刻な脆弱性--連絡先情報が読み取られる危険も
Windows XPのバックアップユーティリティについて知っておくべき10のこと
S・ウォズニアック氏:「エンジニアは自分の心に従って行動すべき」--IDFインタビュー
Firefox 3.1のHTML 5対応を検証--Canvas Text APIとCanvas Shadow API
グーグルが、無料社食をついに廃止?--真実はいかに
iPhoneからサーバにSSHログイン:TouchTerm
トップページにみる日本のウェブデザイン--表現したい人たちが集うMySpace
モジラ、「Firefox 3.1」でJavaScript実行を大幅に高速化
DELLが掲げる「新・仮想化アセスメントサービス」
「シンプル」&「低コスト」な運用管理
Webセキュリティ特集
Techno Exchange
ZDNet Japan Green IT
セキュリティ対策レベルテスト公開!
仮想化環境で求められるストレージの要件
APC SOLUTIONS FORUM 2008をレポート
ZDNet Japan ホスティング特集