美文网首页
setTimeout函数this指针指向全局的问题

setTimeout函数this指针指向全局的问题

作者: 彼采_萧兮 | 来源:发表于2017-12-18 16:00 被阅读0次

setTimeout的this会指向全局变量:


var num = 0;

function Obj (){

this.num = 1,

this.getNum = function(){

console.log(this.num);

},

this.getNumLater = function(){

setTimeout(function(){

console.log(this.num);

}, 1000)

}

}

var obj = new Obj;

obj.getNum();//1  打印的是obj.num,值为1

obj.getNumLater()//0  打印的是window.num,值为0

从上述例子中可以看到setTimeout中函数内的this是指向了window对象,这是由于setTimeout()调用的代码运行在与所在函数完全分离的执行环境上。这会导致这些代码中包含的this关键字会指向window(或全局)对象。

解决方法:

1.将当前对象的this存为一个变量,定时器内的函数利用闭包来访问这个变量:

var num = 0;

function Obj (){

var that = this;    //将this存为一个变量,此时的this指向obj

this.num = 1,

this.getNum = function(){

console.log(this.num);

},

this.getNumLater = function(){

setTimeout(function(){

console.log(that.num);    //利用闭包访问that,that是一个指向obj的指针

}, 1000)

}

}

var obj = new Obj;

obj.getNum();//1  打印的是obj.num,值为1

obj.getNumLater()//1  打印的是obj.num,值为1

2.利用bind()方法:

var num = 0;

function Obj (){

this.num = 1,

this.getNum = function(){

console.log(this.num);

},

this.getNumLater = function(){

setTimeout(function(){

console.log(this.num);

}.bind(this), 1000)    //利用bind()将this绑定到这个函数上

}

}

var obj = new Obj;

obj.getNum();//1  打印的为obj.num,值为1

obj.getNumLater()//1  打印的为obj.num,值为1
  1. 箭头函数:
var num = 0;

function Obj (){

this.num = 1,

this.getNum = function(){

console.log(this.num);

},

this.getNumLater = function(){

setTimeout(() => {

console.log(this.num);

}, 1000)    //箭头函数中的this总是指向外层调用者,也就是Obj

}

}

var obj = new Obj;

obj.getNum();//1  打印的是obj.num,值为1

obj.getNumLater()//1  打印的是obj.num,值为1

ES6中的箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj,因此利用箭头函数就可以轻松解决这个问题。

相关文章

  • setTimeout函数this指针指向全局的问题

    setTimeout的this会指向全局变量: 从上述例子中可以看到setTimeout中函数内的this是指向了...

  • 2020-08-17 shopee一面

    估计是凉凉,伤心。 this指针指向问题,关注setTimeout中,this应该是指向window的 A{} W...

  • 函数指针

    概念: 指针函数, 函数指针, 指针数组, 数组指针, 指向数组的指针, 指向函数指针数组的指针。

  • 指针

    一. 指针指向的是对象的地址//函数指针:指针指向函数//指针函数:函数返回指针 二.

  • 回调函数

    函数指针 (1) 函数指针是指指向函数而非指向对象的指针。像其它指针一样,函数指针也指向某个特定的函数类型,函数类...

  • C语言基础知识点

    函数指针与回调函数 1、函数指针:函数指针是指向函数的指针变量,以下实例声明了函数指针变量 p,指向函数 max:...

  • C语言学习六 — 函数指针,回调函数,字符串与结构体

    函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向...

  • 【随笔】关于异步编程中的bind(this)

    异步编程中的.bind(this)方法解决了异步执行后this指针指向全局函数的问题,主要可以通过以下两个场景加以...

  • C语言基础教程之函数指针

    函数指针 函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函...

  • C函数指针

    函数指针 函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函...

网友评论

      本文标题:setTimeout函数this指针指向全局的问题

      本文链接:https://www.haomeiwen.com/subject/fasmwxtx.html