javascript - 关于jQuery中callbacks对象的fire方法

查看:60
本文介绍了javascript - 关于jQuery中callbacks对象的fire方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

 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循环的这里:

 //这里的apply
 if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
        memory = false; // To prevent further calls using add
        break;
 }

拆解:

   //源代码
   list[ firingIndex ].apply( data[ 0 ], data[ 1 ])
   //拆解
   var callback = lsit[ firingIndex ];
   callback.apply(data[0],data[1]); //通过apply执行

Function.prototype.apply方法行为是临时改变函数的指针并运行的方法,传递两个参数:第一个参数重设函数中this的指向,第二个参数是一个数组,它会把这个数组拆分成参数列表传递进函数,简单来说就是:把一个方法借给另外一个对象使用

var foo = {
    name: 'foo',
    log: function () {
        console.log(this.name);//this被apply改变
        console.log(arguments);//apply的第二个参数,传的数组会被拆分成参数列表
    }
};

var bar = {
    name: 'bar'
};


//通过apply改变this指向
foo.log.apply(bar, ['0', '1'])

/*
输出:
bar
["0", "1"]
*/

还有个Function.prototype.callFunction.prototype.apply的亲兄弟。

详情请参考MDN:

这篇关于javascript - 关于jQuery中callbacks对象的fire方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆