【问题描述】

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

  1. var demoChange = {
  2. key: true,
  3. changeFun() {
  4. console.log('调用函数');
  5. this.key = true;
  6. },
  7. init() {
  8. setInterval(function () {
  9. if (this.key) { // 此处会报出this.key is undefined 的错误
  10. this.key = false;
  11. this.changeFun();
  12. }
  13. }, 3000);
  14. }
  15. }
  16. demoChange.init();

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

【解决方案】

1、保存this变量

  1. var demoChange = {
  2. key: true,
  3. changeFun() {
  4. console.log('调用函数');
  5. this.key = true;
  6. },
  7. init() {
  8. var _this = this; // init()函数由对象调用,因此this指向对象
  9. setInterval(function () {
  10. if (_this.key) { //闭包原理 函数内部找不到_this变量,会向父级作用域找
  11. _this.key = false;
  12. _this.changeFun();
  13. }
  14. }, 3000);
  15. }
  16. }
  17. demoChange.init();

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

  1. var demoChange = {
  2. key: true,
  3. changeFun() {
  4. console.log('调用函数');
  5. this.key = true;
  6. },
  7. init() {
  8. setInterval(function () {
  9. if (this.key) {
  10. this.key = false;
  11. this.changeFun();
  12. }
  13. }.bind(this), 3000); // bind会将第一个参数替换函数内的this指向,这里不用call/aplly是因为它们会立即执行函数,而bind不会。
  14. }
  15. }
  16. demoChange.init();

3、箭头函数

  1. var demoChange = {
  2. key: true,
  3. changeFun() {
  4. console.log('调用函数');
  5. this.key = true;
  6. },
  7. init() {
  8. setInterval(() => { // 箭头函数内没有this指向问题,this会使用父级作用域中的this
  9. if (this.key) {
  10. this.key = false;
  11. this.changeFun();
  12. }
  13. }, 3000);
  14. }
  15. }
  16. 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. 用linux主机做网关搞源地址转换(snat)

    一.原理图  二.环境 外网  A:192.168.100.20 (vmnet1) 网关  B:192.168.100.10 (vmnet1)     192.168.200.10 (vmnet2) ...

  2. 【VS开发】DLL和ocx的区别

    ActiveX,OLE是基于COM的一种应用,其文件后缀一般以dll和ocx结尾:ocx作为一种特殊的dll文件,具有一定的用户界面和事件响应,而dll文件只是方法和属性的集合. 一.关于DLL的介绍 ...

  3. Elasticsearch操作索引

    目录 操作索引 1. 基本概念 2. 创建索引 2.1 语法 2.2查看索引设置 2.3.删除索引 2.4 映射配置 2.5 新增数据 2.6 修改数据 2.7 删除数据 3. 查询 3.1 基本查询 ...

  4. 吴恩达机器学习103:SVM之大间隔分类器的数学原理

    1.向量内积: (1)假设有u和v这两个二维向量:,接下来看一下u的转置乘以v的结果,u的转置乘以v也叫做向量u和向量v的内积,u是一个二维向量,可以将其在图上画出来,如下图所示向量u: 在横轴上它的 ...

  5. H5 拍照图片旋转、压缩和上传

    原文地址:github.com/whinc/blog/… 最近接到一个“发表评论”的需求:用户输入评论并且可以拍照或从相册选择图片上传,即支持图文评论.需要同时在 H5 和小程序两端实现,该需求处理图 ...

  6. 如何计算java程序运行花了多长时间。加时间戳。

    long start = System.currentTimeMillis(); // 记录起始时间 try { Thread.sleep(5000); // 线程睡眠5秒,让运行时间不那么小 } c ...

  7. 2019-11-29-VisualStudio-使用新项目格式快速打出-Nuget-包

    title author date CreateTime categories VisualStudio 使用新项目格式快速打出 Nuget 包 lindexi 2019-11-29 10:15:25 ...

  8. windows核心编程01_错误处理

    windows函数调用出错时,可以通过方法去查询出错根源在哪里. #include <Windows.h> #include <iostream> using namespac ...

  9. PHP实现app唤起支付宝支付代码

    本文主要和大家分享PHP实现app唤起支付宝支付代码,希望能帮助到大家. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  10. Linux20期学习笔记 Day1

    Linux就该这么学第一章 1.4重置root管理员密码  放到红帽RHCSA考前辅导视频 源代码安装: 弊端:(好处第二章讲解) 1.难度高,安装困难 2.自己解决依赖关系(暂时不说) 新技术:RP ...