【问题描述】

 setTimetout/setInterval中this指针指向window,以下是一个小demo:

var demoChange = {
key: true,
changeFun() {
console.log('调用函数');
this.key = true;
},
init() {
setInterval(function () {
if (this.key) { // 此处会报出this.key is undefined 的错误
this.key = false;
this.changeFun();
}
}, 3000);
}
}
demoChange.init();

我想要的是this指定demoChange对象,但是function中的this指向的是window。

【解决方案】

1、保存this变量

var demoChange = {
key: true,
changeFun() {
console.log('调用函数');
this.key = true;
},
init() {
var _this = this; // init()函数由对象调用,因此this指向对象
setInterval(function () {
if (_this.key) { //闭包原理 函数内部找不到_this变量,会向父级作用域找
_this.key = false;
_this.changeFun();
}
}, 3000);
}
}
demoChange.init();

2、改变函数内部this指向:bind

var demoChange = {
key: true,
changeFun() {
console.log('调用函数');
this.key = true;
},
init() {
setInterval(function () {
if (this.key) {
this.key = false;
this.changeFun();
}
}.bind(this), 3000); // bind会将第一个参数替换函数内的this指向,这里不用call/aplly是因为它们会立即执行函数,而bind不会。
}
}
demoChange.init();

3、箭头函数

var demoChange = {
key: true,
changeFun() {
console.log('调用函数');
this.key = true;
},
init() {
setInterval(() => { // 箭头函数内没有this指向问题,this会使用父级作用域中的this
if (this.key) {
this.key = false;
this.changeFun();
}
}, 3000);
}
}
demoChange.init();

【参考文章】https://www.cnblogs.com/zsqos/p/6188835.html

【知识】定时器setTimeout/setInterval执行时this指针指向问题的更多相关文章

  1. 定时器(setTimeout/setInterval)调用带参函数失效解决方法

    也许你曾碰到过这样的问题,不管是setInterval()还是setTimeout(),当code参数里放一个带参函数时,定时器都会失效,看下面这个例子: function test(str){ al ...

  2. 清除定时器 和 vue 中遇到的定时器setTimeout & setInterval问题

    2019-03更新 找到了更简单的方法,以setinterval为例,各位自行参考 mounted() { const that = this const timer = setInterval(fu ...

  3. Juqery 定时器 settimeout setInterval

    setTimeout 只执行一次 setTimeout(loading_tree,2000); function loading_tree(){ $('body').mLoading("hi ...

  4. JS黑魔法之this, setTimeout/setInterval, arguments

    最近发现了JavaScript Garden这个JS黑魔法收集处,不过里面有一些东西并没有说得很透彻,于是边看边查文档or做实验,写了一些笔记,顺手放在博客.等看完了You don't know JS ...

  5. javascript定时器:setTimeout与setInterval

    概述: setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段,只执行一次: setInterval:周期性地调用一个函数(function)或者执行一段代码,重复执行: 语法格式 ...

  6. 定时器setTimeout()和setInterval()使用心得整理

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成. 一.setTimeout() setTimeout函 ...

  7. 有关定时器setTimeout()、setInterval()详解

    JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成. setTimeout() setTimeout函数用 ...

  8. JS Window对象 计时器setInterval() 在执行时,从载入页面后每隔指定的时间执行代码。

    计时器setInterval() 在执行时,从载入页面后每隔指定的时间执行代码. 语法: setInterval(代码,交互时间); 参数说明: 1. 代码:要调用的函数或要执行的代码串. 2. 交互 ...

  9. js中setTimeout/setInterval定时器用法示例

    js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 functio ...

随机推荐

  1. 【VS开发】【电子电路技术】RJ45以太网传输线研究

    RJ45以太网传输线研究 最近研究远距离差分视频传输方案,理所当然想到了LVDS协议.至于选用cameralink传输线,还是选用其他方案,本人更倾向于廉价的RJ45以太网线来实现LVDS差分信号的传 ...

  2. jmeter-在beanshell里用代码提取参数

    接口返回json(response_data): { "Code":1, "Message":null, "Error":null, &qu ...

  3. NFC读写器调试总结20191203

    以下为NFC读写器调试经验总结: 1.读写器部分,从TX1/TX2输出的13.56MHZ信号主要由L0/C0构成低通滤波器,用于滤除13.56MHZ的高次谐波,取值L0=1UH,C0=47PF时候,谐 ...

  4. tableau desktop

    参考: 入门指南: https://help.tableau.com/current/guides/get-started-tutorial/zh-cn/get-started-tutorial-co ...

  5. python3—廖雪峰之练习(一)

    变量练习 小明的成绩从去年的72分提升到今年的85分,请计算小明成绩提升的百分点.并用 字符串格式化显示出'xx.x%',只保留小数点后一位: s1 = 72 s2 = 85 r = (85-72)/ ...

  6. Luogu P3959 [NOIP2017]宝藏

    题目 STO rqy OTZ 首先这种题一看我们就知道可以爆搜. prim一眼假了,但是加个SA也能过. 所以我们来写状压. 记\(f_{i,j,S}\)表示起点到\(j\)距离为\(i\),我们现在 ...

  7. how to create a flask server

    1. use database 2. use redis 3. inport/export excel2007 version+ from flask import send_from_directo ...

  8. Vue常用修饰符

    Vue提供了事件修饰符用于DOM的事件处理,常用的事件修饰符有以下几个: (1). stop:阻止冒泡(通俗讲就是阻止事件向上级DOM元素传递) 点击内层div的结果: 点击外层div的结果: 修改代 ...

  9. Android中res下anim和animator文件夹区别与总结

    1.anim文件夹 anim文件夹下存放tween animation(补间动画)和frame animation(逐帧动画) 逐帧动画: ①在animation-list中使用item定义动画的全部 ...

  10. jsp-TagLib标签库

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ t ...