定时器里面的作用域问题
/*各种运动 */ function Animation(){};Animation.prototype={ /* 匀速运动 */linear:function(obj,target){obj.timer=null;clearInterval(obj.timer);var step=obj.offsetLeft<target?5:-5;//用位置来判断运动的方向if(obj.offsetLeft!=target){obj.timer=setInterval(function(){var res=target-obj.offsetLeft;//核心好代码 当运动到指定位置的时候差值不会超过5 来作为停止运动的条件if(Math.abs(res)<=Math.abs(step)){obj.style.left=target+"px";clearInterval(obj.timer);}else{obj.style.left=obj.offsetLeft+step+"px";}} ,1000/60); }},/* 循环往复运动 */loop:function(obj,target){var timer=null;clearTimeout(timer);var fn=arguments.callee.bind(this);//绑定this指向if(obj.offsetLeft==target){this.linear(obj,0);}else if(obj.offsetLeft==0){this.linear(obj,target);}/*定时器的作用域是全局作用域在里面调用的函数都是全局作用域下调用的*/timer=setTimeout(function(){ fn(obj,target);},900);} }
var animation=new Animation();
刚开始我没有绑定fn的this指向的时候 一直报错
我当时就想咋回事呢 明明函数是定义在Animation里面的 方法也是由它调用的 所以this应该指向的是Animation呀
于是乎我就继续往下看 看打了
奥,明白了 setTimeout 和 setInterval
一般都是这么写
timer=setTimeout(function(){},1000/60);
function 就是定时器函数的一个回掉函数
是由定时器函数去执行的 所以 回调函数里面的this
就是setInterval 里面的this
而setInterval函数的调用者是window
所以回调函数里面的this指的是window
而linear是定义在Animation里面的 所以找不到函数 报错
如果把fn函数的作用域绑定在Animation上 就没关系了
var fn=arguments.callee.bind(this);当调用loop的时候 this指的就是Animation 如果没明白 我再举一个简单的例子var obj={ age:"17;} setInterval(function(){ console.log(this.age); }.bind(obj),1000);
转载于:https://www.cnblogs.com/liveoutfun/p/9309795.html
定时器里面的作用域问题相关推荐
- Jmeter组件执行顺序与作用域
一.Jmeter重要组件: 1)配置元件---Config Element: 用于初始化默认值和变量,以便后续采样器使用.配置元件大其作用域的初始阶段处理,配置元件仅对其所在的测试树分支有效,如,在同 ...
- jmeter定时器的使用_jmeter压测学习30定时器之固定定时器(sleep等待时间)
前言 Jmeter的线程组在发送2个请求之间需要设置一个等待时间时,类似于代码里面的sleep休眠时间,可以用固定定时器解决. 固定定时器 有2个HTTP请求,a是注册用户请求,b是登录的请求.先发a ...
- Javascript——进阶(事件、数组操作、字符串操作、定时器)
目录 事件属性 数组 字符串操作 定时器 变量的作用域 封闭函数 弹框接收数据 事件属性 参数 描述 onclick 鼠标点击事件 onmouseover 鼠标移入标签,触发行为 onmouseout ...
- Jmeter之控制线程执行到某个结果时退出执行(第二种解决方案)
业务背景 触发测试用例,大约需要执行10分钟 查询执行的commitId的测试用例的执行结果 如果通过了则直接停止测试用例,或beanshell 异常也要停止,否则获取不到结果,无限执行也是没有意义的 ...
- JMeter常用组件
本文转至http://blog.chinaunix.net/uid-26884465-id-3418212.html,个人觉得写得非常不错,适合初学者 1.线程组 程组是任何测试计划的起点,所有的逻辑 ...
- jmeter测试元件--控制器
jemter 有两种类型的控制器:采样器和逻辑控制器,二者结合起来驱动了测试进程 采样器 采样器告诉jmeter发送一个请求到指定服务器,并等待服务器的请求.采样器或按照其在测试树中的顺序去执行,还可 ...
- 【前端小白的每日一点】
每日一题 2020-08-04 Object.defineProperty(object, propertyName, descriptorObject) 2020-08-05 function中的t ...
- 【全栈接口测试进阶系列教程】入门到入职的jmeter接口测试工具实战,接口测试步骤,正则表达式jsonpath,断言,接口加密,beanshell,jdbc,jmeter+ant+jenkins
目录 [本文简介看之前请详细的看完介绍] 本文是全网首发的[全栈接口测试进阶系列教程]jmeter接口测试工具从入门到入职, 接口系列包含 接口测试系列包含所有的接口测试工具入门到入职,如果你喜欢的话 ...
- 2016年最权威的1000集大型web前端视频教程(爱创课堂出品)
爱创课堂Web前端开发工程师培训-价值1万8课程 Web前端开发工程师,主要职责是利用HTML.XHTML.CSS.JAVAScript.FLASH等各种Web前端技术进行客户端产品的开发.完成客户 ...
最新文章
- [错误收录] the pyflakes.vim plugin requires Vim to be compiled with +python
- mysql模糊匹配like 之 %
- 【并查集】【图论】【最小生成树】剑鱼行动(ssl 1618)
- 分析varnish日志
- 【渝粤教育】广东开放大学 形成性考核 (29)
- 解决办法:更新linux时候提示“由于没有公钥,无法验证下列签名 ***”
- 设计模式之十三:适配器模式(Adapter)
- html系统网页代码大全,html网页的代码大全
- 计算机在配置windows update,电脑开机出现配置Windows update怎么办
- matlab-基础 取整函数 向0取整 取最近整数 向上取整 向下取整
- 我复盘了自己的工作,总结了这个跨境支付产品经理的成长经验给你
- 一个Node程序猿上海的一周
- java选取最大数字_用Java程序找最大的数字(4.1)
- 0ctf_2017_babyheap
- 用javascript的正则表达式来验证Email地址是否格式正确
- Cannot find current proxy: Set ‘exposeProxy‘ property on Advised to ‘true‘ to make it available,and.
- VMware虚拟机装windows xp系统
- 【出差总结】出差0902
- 花了三年时间开发的四轴运动控制卡,可以替代mcx314运动控制IC
- 博主-橄榄山软件创始人-其人其事