mui.pushToRefresh组件下拉回调函数中this指向问题
先看一段代码
(function($) {
    //阻尼系数
    var deceleration = mui.os.ios ? 0.003 : 0.0009;
    $('.mui-scroll-wrapper').scroll({
        bounce: false,
        indicators: true, //是否显示滚动条
        deceleration: deceleration
    });
    var up, down;
    $.ready(function() {
        //循环初始化所有下拉刷新,上拉加载。
        $.each(document.querySelectorAll('.mui-slider-group .mui-scroll'), function(index, pullRefreshEl) {
            $(pullRefreshEl).pullToRefresh({
                down: {
                    callback: function() {
                        var self = this;
                        down = self;
                        setTimeout(function() {
                            var ul = self.element.querySelector('.mui-table-view');
                            ul.insertBefore(createFragment(ul, index, 10, true), ul.firstChild);
                            self.endPullDownToRefresh();
                        }, 1000);
                    }
                },
                up: {
                    callback: function() {
                        var self = this;
                        up = self;
                        console.log(up === down);
                        setTimeout(function() {
                            var ul = self.element.querySelector('.mui-table-view');
                            ul.appendChild(createFragment(ul, index, 5));
                            self.endPullUpToRefresh();
                        }, 1000);
                    }
                }
            });
        });
        var createFragment = function(ul, index, count, reverse) {
            var length = ul.querySelectorAll('li').length;
            var fragment = document.createDocumentFragment();
            var li;
            for (var i = 0; i < count; i++) {
                li = document.createElement('li');
                li.className = 'mui-table-view-cell';
                li.innerHTML = '第' + (index + 1) + '个选项卡子项-' + (length + (reverse ? (count - i) : (i + 1)));
                fragment.appendChild(li);
            }
            return fragment;
        };
    });
})(mui);
上面代码30行我测试了一下down和up中的this是否引用了同一个对象,返回结果如下:

为了验证我的推断,写了如下测试代码:
var o = Object.create({ id: 1, name: 'tom' });
o.age = 19;
console.log(o);
o.print = function(obj) {
    Object.assign(obj, o);
    console.log(JSON.stringify(obj));
    obj.up.callbackup();
    obj.down.callbackdown();
}
o.print({
    up: {
        callbackup() {
            upCb(this);
        }
    },
    down: {
        callbackdown() {
            downCb(this);
        }
    }
});
pullDownLoading: function() {
    if (this.loading) {
        return;
    }
    if (!this.pullDownTips && this.options.down.pullDownTipStyle === 'pullDownTips') {
        this.initPullDownTips();
        this.dragEndAfterChangeOffset(true);
        return;
    } else {
        scroll.scrollTo(0, 40, 100);
        scroll.stopped = true;
    }
    this.loading = true;
    this.addMask();
    if (this.pullDownTips && this.options.down.pullDownTipStyle === 'pullDownTips') {
        this.pullDownTips.classList.add(CLASS_TRANSITIONING);
        this.pullDownTips.style.webkitTransform = 'translate3d(0,' + this.options.down.height + 'px,0)';
    } else {
        var topTipIcon = document.getElementById('topTipIcon');
        topTipIcon.className = 'mui-pull-loading mui-icon mui-spinner';
        topTipIcon.style.webkitAnimation = 'spinner-spin 1s step-end infinite';
        document.getElementById('topTipText').innerText = '正在刷新...';
    }
    this.options.down.callback.apply(this);
}
第26行,尽管js中变量的作用域是定义时就确定了的,但是可以使用aplly, call等方法在运行时改变方法的上下文对象,从而可以解释本文开头的疑惑了。
mui.pushToRefresh组件下拉回调函数中this指向问题的更多相关文章
- 关于Vue中页面(父组件)下拉,页面中的子组件加载更多数据的实现方法
		
一个项目中存在很多这种情况:父组件(页面)中的子组件需要做下拉加载更多的需求,但是这个下拉到底部的动作只能通过监控页面(父组件)来完成 这就需要父子组件之间的通信,代码如下: 1. 建立一个用于父子组 ...
 - JavaScript 回调函数中的 return false 问题
		
今天一个同事问了我一个问题,就是在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行,他不解的是在回调函数中已经 return false 了,但是 Aja ...
 - JS回调函数中的this指向(详细)
		
首先先说下正常的this指向问题 什么是this:自动引用正在调用当前方法的.前的对象. this指向的三种情况 1. obj.fun() fun中的this->obj,自动指向.前的对 ...
 - Javascript回调函数中的this指向问题
		
使用js中的定时器(setInterval,setTimeout),很容易会遇到this指向的问题. 直接上例子: 1 var name = 'my name is window'; 2 var ob ...
 - PHP.TP框架下商品项目的优化3-php封装下拉框函数
		
php封装下拉框函数 因为在项目中会经常使用到下拉框,所以根据一个表中的数据制作下拉框函数,以便调用 //使用一个表的数据做下拉框函数 function buildSelect($tableName, ...
 - OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析
		
☞ ░ 前往老猿Python博文目录 ░ 一.使用全局变量进行变量传递 OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数,我们来看个样例. 1.1.案例1代 ...
 - 回调函数中使用MFC类的成员或对话框控件的简单方法
		
在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...
 - 【spring    后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中
		
问题: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示: 问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...
 - 使用匿名函数在回调函数中正确访问JS循环变量
		
有时候, 需要以不同的参数调用某个URL,并且在回调函数中仍然可以访问正在使用的参数, 这时候, 需要使用闭包保存当前参数, 否则, 当回调函数执行时, 之前的参数很可能早已被修改为最后一个参数了. ...
 
随机推荐
- POJ1611-The Suspects-ACM
			
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 23002 Accepted: 11171 De ...
 - 用Apache实现一个ip虚拟多个web站点
			
如何用Apache实现一个ip虚拟多个web站点? 首先添加虚拟的服务器名 <virtualhost www.xxx.com:80="">DocumentRoot d: ...
 - C#中调用WIN32的API
			
最近在学习C#中的GDI部分,本来尝试编写一个字幕控件(其实还是用label比较合适),但是发现控件中用GDI将整个控件粉刷貌似不行(应该是我水平不行),所以就去捣鼓了下WIN32的DLL,发现用AP ...
 - Spark的RDD编程(二)公众号undefined110
			
创建RDD有两种方式:①读取外部数据集,lines=sc.textFile("README.md").②对一个集合进行并行化,lines=sc.parallelize([" ...
 - 转:gpio_request
			
今天再次学习SD卡驱动,遇到pgio_request这个函数,始终不知道其什么意思,看了几遍源代码才有了点感觉.现将其关键部分再此说明一下,以备自己以后复习,或是路客参考. 一般gpio_reques ...
 - DB2中时间格式化
			
values to_char(current timestamp - 7 hours,'hh24')||'点' values varchar(hour(current time + 5 hour))| ...
 - bzoj1221
			
网络流与线性规划24题中的餐巾计划吧明显要拆点吧,把每一天拆成2个点,i,i+n起点 终点 容量 费用 s i inf c 每天都可以购买新毛巾 i ...
 - Course Schedule ——LeetCode
			
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
 - bzoj 1927 [Sdoi2010]星际竞速(最小费用最大流)
			
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1576 Solved: 954[Submit][Statu ...
 - 解密HOMS
			
一个可以做证券账户多账户和子账户管理软件.早年是提供给基金或者机构使用的,毕竟传统印象中,也只有他们有多个账户需要汇集.单一账户需要拆分. 本来作为专业的工具,在小范围内传播,和大众也没多大关系,行业 ...