は、誰かが説明していただけますか?jQueryの匿名関数の変数のスコープ
を編集してください:問題の原因と思われるqueryTypeプロパティが実際に設定されていません。申し訳ありません。私はまだ誰かのためになぜがの仕事をするのかを説明することに興味があります。これは、クリック機能がデータオブジェクトの範囲外で実行されていることを前提としています。
は、誰かが説明していただけますか?jQueryの匿名関数の変数のスコープ
を編集してください:問題の原因と思われるqueryTypeプロパティが実際に設定されていません。申し訳ありません。私はまだ誰かのためになぜがの仕事をするのかを説明することに興味があります。これは、クリック機能がデータオブジェクトの範囲外で実行されていることを前提としています。
事data
関数が呼び出されますが、それを返すときも(それゆえ、あなたのコールバックが呼び出される前に)いない場合のみです。呼び出しシーケンスは次のようになります。
data = { /* interesting things */ };
displayResults(data);
delete data.queryType;
// Time passes and then your callback gets called
// but data.queryType is undefined.
私はあなたの状況の正確な状況はわかりませんが、何が起こる可能性があるかを要約しています。
data
でクロージャを作成すると、data
につかんでいますが、これは内部のものをロックしたことを意味しません。data
data
がどこから来ている
は、今、私たちは知っていること、それが最初の場所で壊れた理由data
が正しいと放置されたときにそれが動作する理由は、我々は考えることができます。
あなたは匿名のコールバック関数を作成する場合:
function() {
alert(data.queryType);
return false;
}
あなたが(または、より正確に、何data
点まで)とdata
が殺されることはありませんdata
を参照の上保持しているクロージャを作成しているが誰もそれを参照していなくなるまでオフにします。変数の有効期間はスコープによって異なります。あなたのdata
変数はあなたのdisplayResults
機能の中に生きています。しかし、変数は単にメモリ内のオブジェクトとそのオブジェクトを参照(または指す)するだけで、もはやそれが誰も参照しなくなるまで多かれ少なかれ固執します。
変数名と名前付きオブジェクトは、別々の存続期間を持つ別個のエンティティです。ブルース・リーを引用するには
天国の栄光をすべて忘れてしまいます。
ポインタと呼ばれていない場合でも、プログラミングの際にポインタから離れてしまうことはありません。
スコープに関係なく変数の割り当てを追跡するには、getterとsetterを使用する必要があります。 displayResults
コントロールを呼び出す
var data = {};
setDataQueryType('post');
$("#odNextPage").click(function() {
alert(getDataQueryType()); // 'post'
setDataQueryType('get');
alert(getDataQueryType()); // 'get'
return false;
});
// Getter for query type
function getDataQueryType() {
return data.queryType;
}
// Setter for query type
function setDataQueryType(val) {
data.queryType = val;
}
この関数は実際にはここでは呼び出されません。それは周りを渡され、それが呼び出されたときに文脈が異なります。 – QuentinUK
データは未定義かdata.queryTypeは未定義ですか? – Dennis
クリック機能は 'data'と同じコンテキストで定義されているので動作します。クリックイベントが生成されると、このクリック関数が呼び出され、関数が作成されたスコープ内で 'data'が検索されます。 – buryat