David Schwartz が回答を投稿しなかったので、私の解決策 (ほとんど解決策ではありません) と、私が理解している彼の解決策のデモと説明を投稿します。
私の解決策:
スイッチの唯一の目的は入力に応じて変数を設定することだったので、スイッチの使用をやめて JSON (配列) に切り替えただけです。
配列を使用する場合、「ケース」が存在するかどうかを確認するのは簡単です (存在しない場合は run を実行するだけでarrayVar["casename"]
、存在しない場合は undefined が返されます)。追加の変数で名前空間を詰まらせる必要はありません。文字列とedとして提供する必要があるため難しいeval
ですが、全体的にこれは私にとってははるかにうまく機能します.
実際にはこの問題の解決策ではないため、デモやコードを投稿する必要はありません。
David Schwartz のソリューション:
デモ: http://jsfiddle.net/SO_AMK/s9MhD/
コード:
function hasCase(caseName) { return switchName(caseName, true); } // A function to check for a case, this passes the case name to switchName, sets "just checking" to true and passes the response along
function runSwitch(caseName) { switchName(caseName); } // This is actually a mostly useless function but it helps clarify things
function switchName(caseName, c) { // And the actual function, c is the "just checking" variable, I shortened it's name to save code
switch(caseName) { // The switch
case "casename0" : if (c) return true; alert("case"); break; // If c is true return true otherwise continue with the case, returning from inside a case is the same as calling break;
case "casename1" : if (c) return true; alert("case"); break;
case "casename2" : if (c) return true; alert("case"); break;
case "casename3" : if (c) return true; alert("case"); break;
default: if (c) return false; break; // If nothing else ran then the case doesn't exist, return false
}
return c; // Even I (:D) don't understand where this gets changed, but it works
}
説明: 上記のコードは、必要に応じてコメント化されています。</p>