いいえ。引数は、内部で直接定義されたコード、または参照を渡す関数e
でのみ使用できます。渡さない限り whatever()
、内部から呼び出された関数では使用できません。whatever()
これは、すべてのブラウザーで失敗する質問のコードの正確な実装です: http://jsfiddle.net/jfriend00/ReNKU/
解決策については、ローカル関数をe
使用して、次のように他の 2 つの関数で使用できるようにすることができます。これらの関数は のスコープ内で定義されているためですwhatever()
。
function whatever (e) {
function stuff() {
// e is available here
thingy();
}
function thingy() {
// e is available here
}
// e is available here
stuff();
}
または、元の関数のそれぞれに引数として渡すこともできます。
function whatever (e) {
stuff(e);
}
function stuff(e) {
thingy(e);
}
function thingy(e) {
}
関数引数の利用可能性に関するこの質問は、Firefox とは関係ありません。これは、どこでも同じ JavaScript 実装の選択であるためです。
あなたの特定のコードがたまたま他のブラウザで動作している場合、どうやらそれがピックアップしているグローバル変数e
または他の親コンテキストにグローバル変数があり、それはたまたま正しい値を持っていますが、それはそうではありませんあなたの宣言から来ています。いずれにせよ、そのような暗黙の動作に依存するのは良くありません。e
e
whatever(e)
引数 e を他の 2 つの関数で使用できるようにする場合は、次の 2 つの適切な選択肢があります。
- それを引数として渡します。
- これらの関数を のスコープ内で定義して
whatever(e)
、引数を直接見ることができるようにします。
あなたが本当にしようとしているのが、イベント ハンドラーで発生したイベントへのアクセスを取得することである場合は、次のことだけを知っておく必要があります。
を使用している場合.addEventListener()
、イベント データ構造が最初の引数としてイベント ハンドラに渡されます。これは.addEventListener()
、IE9 を含む、サポートするすべてのブラウザーに当てはまります。古いバージョンの IEを使用.attachEvent()
している場合、イベント データ構造はグローバル変数window.event
にあり、そこからアクセスできます。イベント ハンドラーが開始されたら、このデータ構造を呼び出した他の関数で使用できるようにしたい場合は、それを引数としてそれらに渡す必要があります。その後、それらの動作は完全にブラウザーセーフになります。
これは、イベントの違いも処理する簡単なクロス ブラウザー イベント登録関数です。
// add event cross browser
function addEvent(elem, event, fn) {
if (elem.addEventListener) {
elem.addEventListener(event, fn, false);
} else {
elem.attachEvent("on" + event, function() {
// set the this pointer same as addEventListener when fn is called
// and get the event data structure from the global variable and
// pass it to the event handler
return(fn.call(elem, window.event));
});
}
}