先看一段代码
  1. (function($) {
  2. //阻尼系数
  3. var deceleration = mui.os.ios ? 0.003 : 0.0009;
  4. $('.mui-scroll-wrapper').scroll({
  5. bounce: false,
  6. indicators: true, //是否显示滚动条
  7. deceleration: deceleration
  8. });
  9. var up, down;
  10. $.ready(function() {
  11. //循环初始化所有下拉刷新,上拉加载。
  12. $.each(document.querySelectorAll('.mui-slider-group .mui-scroll'), function(index, pullRefreshEl) {
  13. $(pullRefreshEl).pullToRefresh({
  14. down: {
  15. callback: function() {
  16. var self = this;
  17. down = self;
  18. setTimeout(function() {
  19. var ul = self.element.querySelector('.mui-table-view');
  20. ul.insertBefore(createFragment(ul, index, 10, true), ul.firstChild);
  21. self.endPullDownToRefresh();
  22. }, 1000);
  23. }
  24. },
  25. up: {
  26. callback: function() {
  27. var self = this;
  28. up = self;
  29. console.log(up === down);
  30. setTimeout(function() {
  31. var ul = self.element.querySelector('.mui-table-view');
  32. ul.appendChild(createFragment(ul, index, 5));
  33. self.endPullUpToRefresh();
  34. }, 1000);
  35. }
  36. }
  37. });
  38. });
  39. var createFragment = function(ul, index, count, reverse) {
  40. var length = ul.querySelectorAll('li').length;
  41. var fragment = document.createDocumentFragment();
  42. var li;
  43. for (var i = 0; i < count; i++) {
  44. li = document.createElement('li');
  45. li.className = 'mui-table-view-cell';
  46. li.innerHTML = '第' + (index + 1) + '个选项卡子项-' + (length + (reverse ? (count - i) : (i + 1)));
  47. fragment.appendChild(li);
  48. }
  49. return fragment;
  50. };
  51. });
  52. })(mui);

  

上面代码30行我测试了一下down和up中的this是否引用了同一个对象,返回结果如下:

疑惑。。。
根据js词法作用域推断,up对象callback方法中this应该引用的是up对象,down对象callback方法中this应该引用的是down对象
为什么会引用同一个对象呢?

为了验证我的推断,写了如下测试代码:

  1. var o = Object.create({ id: 1, name: 'tom' });
  2. o.age = 19;
  3. console.log(o);
  4. o.print = function(obj) {
  5. Object.assign(obj, o);
  6. console.log(JSON.stringify(obj));
  7. obj.up.callbackup();
  8. obj.down.callbackdown();
  9. }
  10. o.print({
  11. up: {
  12. callbackup() {
  13. upCb(this);
  14. }
  15. },
  16. down: {
  17. callbackdown() {
  18. downCb(this);
  19. }
  20. }
  21. });

  

调试过程查看this引用的对象:

 结果完全符合我的推断
 
查看了mui.pushToRefresh.js,找到了答案:
  1. pullDownLoading: function() {
  2. if (this.loading) {
  3. return;
  4. }
  5. if (!this.pullDownTips && this.options.down.pullDownTipStyle === 'pullDownTips') {
  6. this.initPullDownTips();
  7. this.dragEndAfterChangeOffset(true);
  8. return;
  9. } else {
  10. scroll.scrollTo(0, 40, 100);
  11. scroll.stopped = true;
  12. }
  13. this.loading = true;
  14. this.addMask();
  15. if (this.pullDownTips && this.options.down.pullDownTipStyle === 'pullDownTips') {
  16. this.pullDownTips.classList.add(CLASS_TRANSITIONING);
  17. this.pullDownTips.style.webkitTransform = 'translate3d(0,' + this.options.down.height + 'px,0)';
  18. } else {
  19. var topTipIcon = document.getElementById('topTipIcon');
  20. topTipIcon.className = 'mui-pull-loading mui-icon mui-spinner';
  21. topTipIcon.style.webkitAnimation = 'spinner-spin 1s step-end infinite';
  22. document.getElementById('topTipText').innerText = '正在刷新...';
  23. }
  24. this.options.down.callback.apply(this);
  25. }

  第26行,尽管js中变量的作用域是定义时就确定了的,但是可以使用aplly, call等方法在运行时改变方法的上下文对象,从而可以解释本文开头的疑惑了。

执行callback的时候,this被重定向到pushToRefresh实例对象了。
 

mui.pushToRefresh组件下拉回调函数中this指向问题的更多相关文章

  1. 关于Vue中页面(父组件)下拉,页面中的子组件加载更多数据的实现方法

    一个项目中存在很多这种情况:父组件(页面)中的子组件需要做下拉加载更多的需求,但是这个下拉到底部的动作只能通过监控页面(父组件)来完成 这就需要父子组件之间的通信,代码如下: 1. 建立一个用于父子组 ...

  2. JavaScript 回调函数中的 return false 问题

    今天一个同事问了我一个问题,就是在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行,他不解的是在回调函数中已经 return false 了,但是 Aja ...

  3. JS回调函数中的this指向(详细)

    首先先说下正常的this指向问题 什么是this:自动引用正在调用当前方法的.前的对象. this指向的三种情况 1. obj.fun()     fun中的this->obj,自动指向.前的对 ...

  4. Javascript回调函数中的this指向问题

    使用js中的定时器(setInterval,setTimeout),很容易会遇到this指向的问题. 直接上例子: 1 var name = 'my name is window'; 2 var ob ...

  5. PHP.TP框架下商品项目的优化3-php封装下拉框函数

    php封装下拉框函数 因为在项目中会经常使用到下拉框,所以根据一个表中的数据制作下拉框函数,以便调用 //使用一个表的数据做下拉框函数 function buildSelect($tableName, ...

  6. OpenCV-Python setMouseCallback回调函数中图像变量img的传递方法解析

    ☞ ░ 前往老猿Python博文目录 ░ 一.使用全局变量进行变量传递 OpenCV-Python中可以使用setMouseCallback来设置鼠标事件的回调函数,我们来看个样例. 1.1.案例1代 ...

  7. 回调函数中使用MFC类的成员或对话框控件的简单方法

    在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...

  8. 【spring 后台跳转前台】使用ajax访问的后台,后台正常执行,返回数据,但是不能进入前台的ajax回调函数中

    问题: 使用ajax访问的后台,后台正常执行,并且正常返回数据,但是不能进入前台的ajax回调函数中 问题展示:  问题解决: 最后发现是因为后台的方法并未加注解:@ResponseBody,导致方法 ...

  9. 使用匿名函数在回调函数中正确访问JS循环变量

    有时候, 需要以不同的参数调用某个URL,并且在回调函数中仍然可以访问正在使用的参数, 这时候, 需要使用闭包保存当前参数, 否则, 当回调函数执行时, 之前的参数很可能早已被修改为最后一个参数了. ...

随机推荐

  1. 【Linux】常用命令

    一.文件结构     /:       根目录 /bin:    系统所需要的那些命令位于此目录. /boot:   Linux的内核及引导系统程序所需要的文件目录,GRUB或LILO系统引导管理器也 ...

  2. 【面霸1】php知识点

    PHP简介 Hypertext Preprocessor,超文本预处理器的缩写,主要是用于服务端的脚本程序 PHP 标记风格 1.xml风格   < ? php ? > 2.脚本风格  & ...

  3. PHP数据学习-二维数组【3】

    <?php // $project = array( // array("bai",12,23.0), // array("zeng",34,12.0), ...

  4. python中去掉空行的问题

    在python中处理空行时,经常会遇到一些问题.现总结经验如下: 1.遇到的空行如果只有换行符,直接使用=='\n'或者 len(line)==line.count('\n') 2.有多个空格+换行符 ...

  5. GPUImage 自定义滤镜

    GPUImage 自定义滤镜 GPUImage 是一个基于 GPU 图像和视频处理的开源 iOS 框架.由于使用 GPU 来处理图像和视频,所以速度非常快,它的作者 BradLarson 称在 iPh ...

  6. 阿里云的esc

    云服务器ecs作用如下:1.完全管理权限:对云服务器的操作系统有完全控制权,用户可以通过连接管理终端自助解决系统问题,进行各项操作:2.快照备份与恢复:对云服务器的磁盘数据生成快照,用户可使用快照回滚 ...

  7. oracle审计

    Orcale审计机制研究 1.   设置审计 1.1.  查看审计状态 SQL>conn /as sysdba; 已连接 SQL>show parameters audit_trail; ...

  8. 【Linux】鸟哥的Linux私房菜基础学习篇整理(五)

    1. type [-tpa] name:查看name命令是否为bash内置命令.参数:type:不加任何参数,type会显示出那么是外部命令还是bash的内置命令:-t:当加入-t参数时,type会通 ...

  9. C++中自己理解的一些细节哈

    对于大牛来说,我写的可能很低级哈,留给自己看,以后遇到的都慢慢补充哈!^^ 1.每一个类定义结束后,不要忘了在类的结束符"}"后面加上一个";"哦! 2.构造函 ...

  10. BZOJ1611: [Usaco2008 Feb]Meteor Shower流星雨

    1611: [Usaco2008 Feb]Meteor Shower流星雨 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 904  Solved: 393 ...