关于$.proxy()的问题…

来源:3-6 幻灯片的js--绑定事件续、自动切换和发送消息(自动切换)

夜魇丶

2019-11-20 15:23:27

        this.$elem
            .hover(function(){
                self.$controls.show();
            },function(){
                self.$controls.hide();
            })
            .on('click','.slider-control-left',function(){
                self.to(self._getCorrectIndex(self.curIndex - 1));
            })
            .on('click','.slider-control-right',function(){
                self.to(self._getCorrectIndex(self.curIndex + 1));
            })
            .on('click','.slider-indicator',function(){
                self.to(self._getCorrectIndex(self.$indicators.index(this)));
            });

        // auto
        if(this.options.interval && !isNaN(Number(this.options.interval))){
            this.$elem.hover($.proxy(this.pause,this),$.proxy(this.auto,this));
            this.auto();
        }


不好意思我还是不太明白…

$.proxy 方法接受一个已有的函数,并返回一个带特定上下文的新的函数。

this.$elem.hover($.proxy(this.pause,this),$.proxy(this.auto,this));

这句话的意思,我可不可以理解为:把this.$elem中原本的hover方法,也就是上面加粗的this,类似以下这一部分。

.hover(function(){
                self.$controls.show();
            },function(){
                self.$controls.hide();
            })

替换成this.pause方法。

$(selector).proxy(this1,this2),这个方法是this1替换this2,还是this2替换this1?

(按我的理解是this1替换this2,不知道对不对)

麻烦解答一下,辛苦了。

写回答

1回答

好帮手慕糖

2019-11-20

同学你好,关于你的问题,回答如下:

1、首先了解下,proxy的语法:$(selector).proxy(function,context)

其中,function    要被调用的已有的函数。context 函数所在的对象的名称。    

2、然后对应到我们这个例子中,结合下图进行查看:

http://img.mukewang.com/climg/5dd50b330975b5a511880188.jpg

就是要执行this.pause这个函数,如下部分;后面的this,就是所在的对象

http://img.mukewang.com/climg/5dd50b5f09cfd24a06280153.jpg

同理,后面的$.proxy(this.auto,this)也是执行this.auto这个函数。而this是传递过去的这个函数所在的对象,可以理解为,函数所指向的对象。

3、所以与同学这个是不相等的,同学的这个是hover的时候,调用show()或者hide()是显示隐藏。而this.pause是清除计时器,this.auto是继续调用这个计时器函数。

4、这两个不是替换的关系。这个可以再结合如下例子,来了解下这个方法的使用。可以理解为:$.proxy是用来解决this转移问题的。

(1)在某些情况下,我们调用JS函数时候,this指针并不一定是我们所期望的那个,例如:

$('#myElement').click(function() {
    setTimeout(function() { // 这个this指向的是window(计时器中this指向的是window),而非之前的html元素
        console.log($(this))
        $(this).addClass('aNewClass');
    }, 1000);
});

通常的一种做法是这样的:

$('#myElement').click(function() { 
   var that = this;//用that变量把this储存起来
    setTimeout(function() {
        $(that).addClass('aNewClass');
    }, 1000);
});

(2)在使用jquery框架的情况下, 有一种更好的方式是使用$.proxy函数,$.proxy()接受一个函数,然后返回一个新函数,并且这个新函数始终保持了特定的上下文(context )语境,它有两种语法,如下:

jQuery.proxy( function, context )
/*function:将要改变上下文语境的函数。
*context:函数的上下文语境(`this`)会被设置成这个 object 对象。
*/
jQuery.proxy( context, name )
/*context:函数的上下文语境会被设置成这个 object 对象。
*name:将要改变上下文语境的函数名(这个函数必须是前一个参数 ‘context’ 对象的属性)
*/

比如(1)中的例子可以修改成:

$('#myElement').click(function() {
    setTimeout($.proxy(function() {
        $(this).addClass('aNewClass');  
    }, this), 1000);
});

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

0

0 学习 · 14456 问题

查看课程