有人可以帮助我了解这段代码吗?在这种情况下,我不能完全确定将首先执行哪些代码:/显然这确保它将始终打印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++;
答案 0 :(得分:1)
让我们了解您的asyncify()
函数的功能。
首先,请注意立即调用它,将其结果作为ajax()
调用的第二个参数提供。它返回一个匿名函数。
现在,根据调用匿名函数的时间,发生以下两种情况之一:
1)如果它立即被调用,setTimeout
还没有触发,因此它获取调用它的参数,并将它们与原始函数{{1}包装在一起调用了,在你的情况下是asyncify()
。换行使用result
完成。然后退出,让超时处理实际的呼叫。
2)如果没有立即调用它,当它被调用时,超时已经过去,所以它可以立即用新的参数调用原始函数。这是使用bind()
完成的。