MW211 EXIT

devlog
JavaScript/コールバック関数の変数スコープ
2012年09月20日
以下のようにコールバック関数にグローバル的な変数valueを引き渡すことは
直書きだと可能だ。
┌──────────────────────────────────────┐
│function main() {                                                           │
│    var value = 1;                                                          │
│    $.getJSON(url,                                                          │
│              function(json) {                                              │
│                  alert(value);                                             │
│              }                                                             │
│    );                                                                      │
│}                                                                           │
└──────────────────────────────────────┘

しかし、コールバック関数を外に出すと、引き渡すことはできない。
┌──────────────────────────────────────┐
│function main() {                                                           │
│    var value = 1;                                                          │
│    $.getJSON(url,                                                          │
│              sub                                                           │
│    );                                                                      │
│}                                                                           │
├──────────────────────────────────────┤
│function sub(json) {                                                        │
│    alert(value);                                                           │
│}                                                                           │
└──────────────────────────────────────┘

本格的にグローバル変数にしてしまえばなんとでもなるが、
安易な濫用は避けたいところ。

ってことで、妥協案は以下の通りか。
┌──────────────────────────────────────┐
│function main() {                                                           │
│    var value = 1;                                                          │
│    $.getJSON(url,                                                          │
│              function(json) {                                              │
│                  sub(json, value);                                         │
│              }                                                             │
│    );                                                                      │
│}                                                                           │
├──────────────────────────────────────┤
│function sub(json, value) {                                                 │
│    alert(value);                                                           │
│}                                                                           │
└──────────────────────────────────────┘
コールバック関数に長々と記述するのを避けることはできる。

もっといい方法があるんだろうな、きっと。
分類:JavaScript、jQuery