の範囲に関してpoll
、ヘゲモンの答えはほとんど正しいです。関数はグローバルではありません。しかし、それだけではありません。
あなたが書いた方法は、名前付き関数式poll
として知られているものになります。
JavaScript で関数を記述するには 2 つの方法があることに注意してください。従来の関数宣言:
function foo() {
...
}
宣言には名前を付ける必要があり、一番上に上げられます (基本的に、命令が実行される前に解析されます)。または、関数式:
var foo = function() {
...
}
または
$.ajax('/', function() {
// this is what's known as an anonymous callback
});
または
(function() {
// this is called a self-executing function...
})(); // <-- because we call it immediately
式は他のコードと同じように実行されます。それらは持ち上げられません。
ここで面白いのは、関数式にはオプションの名前を付けることができますが、その名前は関数自体のスコープ外ではアクセスできないということです。言い換えると、
(function foo() {
// `foo` is this function
});
// `foo` will be undefined here
これを書くのとよく似ています:
(function () {
var foo = arguments.callee; // never do this
// `foo` is this function
});
// `foo` will be undefined here
名前付き関数式はそれ自体しか呼び出せない (またはそのスコープ内で宣言された関数によって呼び出される) という事実に加えて、ブラウザーのバグのホスト全体のために、名前付き関数式は、デバッガーまたはプロファイラーでコンテキストを追加する以外では実質的に役に立ちません。 .
それでは、コードを見ていきましょう。
まず、post
クラスを持つ各要素について説明します。jQuery は、一致する要素ごとに匿名のコールバックをすぐに呼び出します。を呼び出そうとしますpoll
が、次のようになります。
- 関数式が巻き上げられていないため、まだ存在しません。コードは
poll
まだ実行されていません。
- 既に実行されていたとしても (たとえば、
$.each
呼び出しを一番下に移動した場合)、post
は名前付きの関数式であるため未定義のままpoll
であり、これらの識別子は関数自体の内部でのみ使用できることがわかりました。
次に、自己実行機能があります。(()
最後の行の ) つまり、poll
引数なしですぐに呼び出されます。おそらく、単一のロング ポール送信が表示されpid=undefined
ます。
おまけ:コールcomplete
バック (一度タイムアウトした後、またはデータを取得した後に新しいロングポールを開始する)はpoll
、その時点で適切に範囲内にあるため、期待どおりに機能します。
このナンセンスをすべて修正するのは、3 文字を削除するのと同じくらい簡単です。願わくば、この時点までに、それらがどの 3 文字であるかを理解できるようになっていることを願っています。(ヒント: 式を宣言にします。)