「JavaScript-指针问题」

栏目: C · 发布时间: 5年前

内容简介:不论是在工作还是学习中,相信大家都会被this指针问题锁困扰,此篇文章就是帮助大家解决this指向问题,希望可以帮大家对this指针有着更深入的了解在项目中,我们不可避免的会使用定时器,定时器也成为大家项目中的家常便客,但是在项目中大家会经常因为定时器this指针问题困扰,特别实在单页面应用中,定时器不关掉会严重消耗资源,下面来给大家介绍下this指针问题和解决方案好了,这样一个简单的demo就搭建完成了,下面来给大家讲解一下为什么这么写

不论是在工作还是学习中,相信大家都会被this指针问题锁困扰,此篇文章就是帮助大家解决this指向问题,希望可以帮大家对this指针有着更深入的了解

1, 定时器中的this指针问题

在项目中,我们不可避免的会使用定时器,定时器也成为大家项目中的家常便客,但是在项目中大家会经常因为定时器this指针问题困扰,特别实在单页面应用中,定时器不关掉会严重消耗资源,下面来给大家介绍下this指针问题和解决方案

//   例如:在vue项目中使用定时器
export default {
    name:"component",
    data(){
        return{
            time:null,         //定义一个定时器初始值
        }
    },
    mounted(){
        //    这个定义变量尽量使用_this,或者self,方便其他同时识别
        let _this = this;

        //    进入页面开始轮询查询接口,这里仅仅演示使用fetch查询,axios同理
        this.time = setInterval(function(){
            fetch('url',{
                methods:'get',
            })
            .then(res => res.json().then(data => console.log(data)))
        },3000)
    },
    destoryed(){
        //    个人习惯,喜欢定义一个局部变量,避免this指针自己不好控制
        let _this = this;
        clearInterval(_this.time)
    }
}复制代码

好了,这样一个简单的demo就搭建完成了,下面来给大家讲解一下为什么这么写

由于个人习惯原因,本人喜欢先定义一个局部变量,避免使用全局变量,既 let _this = this ;

首先我们来看下如果不使用 let _this = this 的效果吧

「JavaScript-指针问题」

可以看到,如果不保存全局变量直接使用 thisthis 会指向 window ,不会指向实例vue,而在 window 上找不到 time 属性,所以无法清楚定时器。

再来实验一下定一个一个局部变量 _this 来保存全局变量吧

「JavaScript-指针问题」

可以看到。定义了局部变量 _this 保存全局变量 this 会使 _this 指向 vue 实例

这样就解决了定时器在单页面项目中无法清除定时器的问题了。

2,  引用值的this指向问题(既堆内存中this的指向)

不管使初学者还是学了很久js的伙伴,大家逗知道调用谁, this 就指向谁,这句话没错,但是要联系上下文,不只是简单的调用谁就指向谁,下面来看一个:chestnut:

var a = 2;
var obj = {
    a:1,
    b:function() {
        console.log(this.a)
    }
}

console.log(obj.b());
var fn = obj.b;
console.log(fn());复制代码

下面来看下这道题的具体思路吧

var a = 2;
var obj = {
    a:1,
    b:function() {
        console.log(this.a)    //    在对象内部调用this,this指向obj
    }
}

console.log(obj.b());         //    此时this指针指向的是obj,打印结果为:1
var fn = obj.b;               //    var 一个变量,此时this指向fn,fn在window上,所以指向window
console.log(fn());            //    此时打印的全局变量window上的a, 既打印结果为:2复制代码

对于下面的 this 指向 window 相信大家可能还有一定的误解,在这里我说一下本人对引用值中 this 的理解

1.谁调用 this 就指向谁

2. var 或者 new 出来的实例逗创建了一个新的实例,全局变量是挂载在 window 上的,所以 this  指向的是 window。

3.原始值中this 的指向(既栈内存中this 的指向)

//    栈内存this的指向相对好理解
var a = 1;                    //申明全局变量a,全局变量挂载在window上
var b = 2;                    //申明全局变量b,全局变量b挂载在window上
console.log(this.a) ;         //this指向window,打印结果:1复制代码

4.箭头函数this指向问题

// 箭头函数没有this,箭头的函数的this指向需要根据上下文来判断

//先来一个简单的例子吧,比如说定时器

var a = 1;
var b = {
    a:2,
    c:setInterval(()=>{
        console.log(this.a,'this指向')
    },1000)
}

b.c;复制代码

这里在 window 上调用 b.c 箭头函数的 this 指向的是全局,所以会打印 1

在上面的堆内存中相同的例子,只是因为箭头函数和普通函数,所以 this 指向的方向也变得不同,这里需要特别:warning:注意,最好在函数内部保存一下全局变量 this!!! (:warning::warning::warning:)

这样相信你对 this 也有了一定的理解,下面我们来看下关于的 this 指针的面试题吧

5, 面试高频this指针问题

var a = 1;
var obj = {
    a:2,
    c:3,
    b:function(a,c) {
        console.log(a+c);
    }
}
var fn = obj.b(this.a,this.c);
console.log(fn);
var fn1 = obj.b.call(this.obj,this.a,this.c);
console.log(fn1)复制代码

首先,分析下这道题

//    这里的this指向的是window,相信大家都没问题
var fn = obj.b(this.a,this.c);            //打印结果 NaN,只在全局变量中找到了this.a,this.c
                                            未定义所以为undefind,数字 + undefind = NaN
复制代码
//    这里本来this指向的是window,但是使用了call()将函数的this指向由window指向了obj
var fn1 = obj.b.call(this.obj,this.a,this.c);        //打印结果为5,在this.obj中找到了
                                                       this.a = 2,this.c = 3;复制代码

以上就是this的基本使用场景,如果大家还有更多好玩的操作,可以在下面留言:pray:

「JavaScript-指针问题」


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

领域驱动设计

领域驱动设计

[美] Eric Evans / 赵俐、盛海艳、刘霞 / 人民邮电出版社 / 2016-6-1 / 69

本书是领域驱动设计方面的经典之作,修订版更是对之前出版的中文版进行了全面的修订和完善。 全书围绕着设计和开发实践,结合若干真实的项目案例,向读者阐述如何在真实的软件开发中应用领域驱动设计。书中给出了领域驱动设计的系统化方法,并将人们普遍接受的一些实践综合到一起,融入了作者的见解和经验,展现了一些可扩展的设计新实践、已验证过的技术以及便于应对复杂领域的软件项目开发的基本原则。一起来看看 《领域驱动设计》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码