誰かがこのコードの周りを頭にお手伝いしてくれますか?私はこの場合最初に実行されるコードは自分で決めることはできません。/これは常にコンソールに1を出力することを保証しますが、理由は分かりません。また、持つライン「orig_fn.bind.applyは...」私にとっては非常に混乱して:/関数を常に非同期にする
function asyncify(fn) {
var orig_fn = fn,
intv = setTimeout(function(){
intv = null;
if (fn) fn();
}, 0)
;
fn = null;
return function() {
// firing too quickly, before `intv` timer has fired to
// indicate async turn has passed?
if (intv) {
fn = orig_fn.bind.apply(
orig_fn,
// add the wrapper's `this` to the `bind(..)`
// call parameters, as well as currying any
// passed in parameters
[this].concat([].slice.call(arguments))
);
}
// already async
else {
// invoke original function
orig_fn.apply(this, arguments);
}
};
}
function result(data) {
console.log(a);
}
var a = 0;
ajax("..pre-cached-url..", asyncify(result));
a++;
[バインド](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)、[適用](https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply)、[setTimeout](https://developer.mozilla.org/en-US/docs/Web/API)/WindowTimers/setTimeout)など。 –
また、デバッガを取得してコードをステップ実行します。それは「どのコードが最初に実行されるのか」を見る最も簡単な方法です。 –
デバッガは非同期呼び出しを調査しようとすると惨めに失敗するでしょう。これを行うことはできますが、chrome開発ツールの使用にはある程度の熟練が必要です。 –