問題が解決した要因としては、以下のポイントが考えられます:
-
即時関数の使用 (IIFE):
- コードを即時実行関数(Immediately Invoked Function Expression, IIFE)で囲むことで、スコープが閉じられ、他のスクリプトとの干渉が防がれます。これにより、同じ変数名や関数名を持つ他のスクリプトとコンフリクトすることがなくなります。
-
window
オブジェクトへの関数の追加:-
window.mouseoverCard
として関数を定義することで、グローバルスコープに関数を追加しました。これにより、関数が複数回定義されることを防ぎつつ、どのスクリプトからもアクセス可能になります。
-
-
関数の存在チェック:
-
if (typeof window.mouseoverCard === 'undefined')
で関数が既に定義されているかどうかをチェックしました。これにより、同じ関数が再定義されることを防ぎました。
-
以下に、重要な変更点をまとめます:
変更前
- 関数定義がグローバルスコープにあり、他のスクリプトとの干渉が発生する可能性がありました。
- 関数がページの再読み込みや他のイベントで再定義されることがありました。
変更後
- コード全体を即時実行関数で囲むことで、スコープを限定しました。
-
window
オブジェクトに関数を追加し、再定義を防ぎました。 - 関数の存在チェックを行い、既に定義されている場合は再定義しないようにしました。
変更点の例
変更前
/**
* 取得投稿一覧のホバー時
*/
const mouseoverCard = (target) => {
// 関数内容
};
変更後
(function() {
/**
* 取得投稿一覧のホバー時
*/
if (typeof window.mouseoverCard === 'undefined') {
window.mouseoverCard = function(target) {
// 関数内容
};
}
// 他のコードも含めて即時実行関数内に配置
})();
まとめ
これらの変更により、スクリプトの安定性が向上し、ブラウザの戻るボタンなどの操作に対する耐性が高まりました。同じ名前の関数が再定義されることも防がれました。