初めて Firefox アドオンを作成しましたが、数か月前にレビューされ、承認されました。このアドオンは、サードパーティの API を頻繁に呼び出します。その間、それは再び見直され、今では setInterval を呼び出す方法が批判されています:
setInterval
潜在的に危険な方法で呼び出されます。脆弱性を防ぐために、setTimeout および setInterval 関数は、最初の引数として関数式を使用してのみ呼び出す必要があります。関数名を参照する変数は受け入れられますが、静的ソース検証に対応していないため非推奨です。
私のアドオンの »アーキテクチャ« についての背景をいくつか紹介します。名前空間にすぎないグローバル オブジェクトを使用します。
if ( 'undefined' == typeof myPlugin ) {
var myPlugin = {
//settings
settings : {},
intervalID : null,
//called once on window.addEventlistener( 'load' )
init : function() {
//load settings
//load remote data from cache (file)
},
//get the data from the API
getRemoteData : function() {
// XMLHttpRequest to the API
// retreve data (application/json)
// write it to a cache file
}
}
//start
window.addEventListener(
'load',
function load( event ) {
window.removeEventListener( 'load', load, false ); needed
myPlugin.init();
},
false
);
}
したがって、これはベストプラクティスではないかもしれませんが、私は学び続けています。間隔自体は、次のinit()
ようにメソッド内で呼び出されます。
myPlugin.intervalID = window.setInterval(
myPlugin.getRemoteData,
myPlugin.settings.updateMinInterval * 1000 //milliseconds!
);
間隔を設定する別のポイントがあります。設定 (設定) に対するオブザーバーは、現在の間隔をクリアし、updateMinInterval 設定への変更が発生したときに上記とまったく同じ方法で設定します。
これを理解すると、»関数式« を使用したソリューションは次のようになります。
myPlugin.intervalID = window.setInterval(
function() {
myPlugin.getRemoteData();
},
myPlugin.settings.updateMinInterval * 1000 //milliseconds!
);
私は正しいですか?
これまで見落としていた、このコードを「攻撃」する可能性のあるシナリオは何ですか?
基本的に、Firefox アドオンでは別の方法で使用し、»通常の« フロントエンド JavaScript では使用する必要がsetInterval
ありますか? setIntervalsetTimeout
のドキュメントは、いくつかの例で宣言された関数を使用する方法を正確に示しているためです。