【知识】定时器setTimeout/setInterval执行时this指针指向问题
【问题描述】
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指针指向问题的更多相关文章
- 定时器(setTimeout/setInterval)调用带参函数失效解决方法
也许你曾碰到过这样的问题,不管是setInterval()还是setTimeout(),当code参数里放一个带参函数时,定时器都会失效,看下面这个例子: function test(str){ al ...
- 清除定时器 和 vue 中遇到的定时器setTimeout & setInterval问题
2019-03更新 找到了更简单的方法,以setinterval为例,各位自行参考 mounted() { const that = this const timer = setInterval(fu ...
- Juqery 定时器 settimeout setInterval
setTimeout 只执行一次 setTimeout(loading_tree,2000); function loading_tree(){ $('body').mLoading("hi ...
- JS黑魔法之this, setTimeout/setInterval, arguments
最近发现了JavaScript Garden这个JS黑魔法收集处,不过里面有一些东西并没有说得很透彻,于是边看边查文档or做实验,写了一些笔记,顺手放在博客.等看完了You don't know JS ...
- javascript定时器:setTimeout与setInterval
概述: setTimeout:在指定的延迟时间之后调用一个函数或者执行一个代码片段,只执行一次: setInterval:周期性地调用一个函数(function)或者执行一段代码,重复执行: 语法格式 ...
- 定时器setTimeout()和setInterval()使用心得整理
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成. 一.setTimeout() setTimeout函 ...
- 有关定时器setTimeout()、setInterval()详解
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成. setTimeout() setTimeout函数用 ...
- JS Window对象 计时器setInterval() 在执行时,从载入页面后每隔指定的时间执行代码。
计时器setInterval() 在执行时,从载入页面后每隔指定的时间执行代码. 语法: setInterval(代码,交互时间); 参数说明: 1. 代码:要调用的函数或要执行的代码串. 2. 交互 ...
- js中setTimeout/setInterval定时器用法示例
js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 functio ...
随机推荐
- 用linux主机做网关搞源地址转换(snat)
一.原理图 二.环境 外网 A:192.168.100.20 (vmnet1) 网关 B:192.168.100.10 (vmnet1) 192.168.200.10 (vmnet2) ...
- 【VS开发】DLL和ocx的区别
ActiveX,OLE是基于COM的一种应用,其文件后缀一般以dll和ocx结尾:ocx作为一种特殊的dll文件,具有一定的用户界面和事件响应,而dll文件只是方法和属性的集合. 一.关于DLL的介绍 ...
- Elasticsearch操作索引
目录 操作索引 1. 基本概念 2. 创建索引 2.1 语法 2.2查看索引设置 2.3.删除索引 2.4 映射配置 2.5 新增数据 2.6 修改数据 2.7 删除数据 3. 查询 3.1 基本查询 ...
- 吴恩达机器学习103:SVM之大间隔分类器的数学原理
1.向量内积: (1)假设有u和v这两个二维向量:,接下来看一下u的转置乘以v的结果,u的转置乘以v也叫做向量u和向量v的内积,u是一个二维向量,可以将其在图上画出来,如下图所示向量u: 在横轴上它的 ...
- H5 拍照图片旋转、压缩和上传
原文地址:github.com/whinc/blog/… 最近接到一个“发表评论”的需求:用户输入评论并且可以拍照或从相册选择图片上传,即支持图文评论.需要同时在 H5 和小程序两端实现,该需求处理图 ...
- 如何计算java程序运行花了多长时间。加时间戳。
long start = System.currentTimeMillis(); // 记录起始时间 try { Thread.sleep(5000); // 线程睡眠5秒,让运行时间不那么小 } c ...
- 2019-11-29-VisualStudio-使用新项目格式快速打出-Nuget-包
title author date CreateTime categories VisualStudio 使用新项目格式快速打出 Nuget 包 lindexi 2019-11-29 10:15:25 ...
- windows核心编程01_错误处理
windows函数调用出错时,可以通过方法去查询出错根源在哪里. #include <Windows.h> #include <iostream> using namespac ...
- 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 ...
- Linux20期学习笔记 Day1
Linux就该这么学第一章 1.4重置root管理员密码 放到红帽RHCSA考前辅导视频 源代码安装: 弊端:(好处第二章讲解) 1.难度高,安装困难 2.自己解决依赖关系(暂时不说) 新技术:RP ...