これは、実際の問題というよりも美的な問題です。Google が提案するコードは問題なく動作します。とはいえ、書くのが苦手です。
Google Chrome 拡張機能を作成する場合、永続ストレージを使用できます。次のように、特定の関数を使用して取得されます。
chrome.storage.sync.get("cake", function(result) {
alert(result["cake"]);
});
これで大丈夫です。ストレージから多くの値を反復処理する場合は、次のようになります。
var keys = new Array("cake", "pie", "squirrel");
$.each(keys, function() {
var key = $('<div>').append(this).html(); // ignore this line
chrome.storage.sync.get(key, function(result) {
alert(result[key]);
});
});
これは完全にうまく機能します。ただし、反復によって変更される外部関数のローカル変数を使用するコールバック関数を技術的に使用しているという考えを揺るがすことはできません。その反復サイクルが終了した後にコールバックが発生することは不可能であると仮定しますが、他の状況 (jQuery クリック イベントなど) では、キー変数の間違った値を使用してしまう可能性があります。
これは、常に結果からキーを取得できれば問題ありません。このような:
var keys = new Array("cake", "pie", "squirrel");
$.each(keys, function() {
var key = $('<div>').append(this).html(); // ignore this line
chrome.storage.sync.get(key, function(result) {
var key;
for (key in result) {}
alert(result[key]);
});
});
ただし、ストレージに既存の値が見つからない場合はできません。プロパティが null に設定されているオブジェクトを返す代わりに、プロパティをまったく持たないオブジェクトを返します (そのため、プロパティの名前を取得できません)。これにより、関数内で最初にクエリされたキーを取得する方法がなくなります。
とにかく機能するので、それは問題ではないと思います。ただ、こういうことを書くのは好きじゃない。それとも、これが奇妙なコードだと思うのは間違っていますか? それとも、もっと適切に行う方法がありますか?