假设这段代码:
function longRunningFunction( fn ) {
window.setTimeout( fn, 1000 ); // just to make it async
}
function myCallback( context ) {
/* ... */
}
现在,如果你有这个:
var uniqueContext = getUniqueContext( );
longRunningFunction( function ( ) { myCallback( uniqueContext ); } );
标准规定context
参数 ofmyCallback
将uniqueContext
在触发回调的那一刻。当您在循环中尝试这样的事情时,它可能会导致一些问题(因为您将uniqueContext
在每次迭代时擦除)。
如果你这样做:
var uniqueContext1 = getUniqueContext1( );
longRunningFunction( function ( ) { myCallback( uniqueContext1 ); } );
var uniqueContext2 = getUniqueContext2( );
longRunningFunction( function ( ) { myCallback( uniqueContext2 ); } );
回调 using保证在第一个结束uniqueContext1
时调用,而在第二个结束时调用 using (具有与以前相同的限制;如果您覆盖或在您的范围内的某处,回调参数也会改变)。longRunningFunction
uniqueContext2
longRunningFunction
uniqueContext1
uniqueContext2
使用 bind 可以避免创建闭包(以及前面提到的默认值)。下面的代码与前面的代码类似,除了你永远无法通过覆盖前面的代码来意外更改参数的值:
longRunningFunction( mycallback.bind( null, getUniqueContext1( ) ) );
longRunningFunction( mycallback.bind( null, getUniqueContext2( ) ) );
mycallback.bind( null, someParameter )
将返回一个函数,该函数在调用时将mycallback
使用null
as this
(将回退到window
像任何常规函数一样)和someParameter
作为第一个参数调用。
另一个答案是只使用第一个参数,bind
因为它们使用this
变量,但这不是必需的,您可以安全地使用函数参数。