fire = function( data ) {
memory = options.memory && data;
fired = true;
firingIndex = firingStart || 0;
firingStart = 0;
firingLength = list.length;
firing = true;
for ( ; list && firingIndex < firingLength; firingIndex++ ) {
if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
memory = false; // To prevent further calls using add
break;
}
}
firing = false;
if ( list ) {
if ( stack ) {
if ( stack.length ) {
fire( stack.shift() );
}
} else if ( memory ) {
list = [];
} else {
self.disable();
}
}
},
这是fire方法的源码,在读的过程中一直有个疑问,到底是哪里真正的让队列中的回调执行了呢?
举个例子,队列中有一个函数fn1(){console.log"1"},那么在这段源码中,哪里真正让fn1执行了呢?
for循环内,只是让stopOnFalse情况下函数返回false时停止fire,下面的深度遍历也是为了把stack中所有需要fire的函数传进fire方法中,但是没有看到哪里让函数真正执行了。。。很困惑。。
希望大神解答下。js初学者,提的问题可能很蠢,希望大神不要笑话。
/------------------------------------------------------------------------/
补充一下,还是有些不理解,我知道apply方法可以让函数在另一个对象上执行,
但是假设有这样一种情况,list = [ fn1(){console.log"1"} , fn2(){return false} ]
list中有两个待fire的函数,调用fire方法,应该是第一个函数在日志打印数字1,第二个函数会stopOnFalse
我不理解的是fn1在什么时候被执行的? if ( fn1.apply( data[ 0 ], data[ 1 ] ===false)这个if条件中,
不是只判断fn1是否返回false吗?难道这里的函数也会被执行?
for循环的这里:
拆解:
Function.prototype.apply
方法行为是临时改变函数的指针并运行
的方法,传递两个参数:第一个参数重设函数中this
的指向,第二个参数是一个数组,它会把这个数组拆分成参数列表传递进函数,简单来说就是:把一个方法借给另外一个对象使用
:详情请参考MDN:
Function.prototype.apply()
Function.prototype.call()