深入浅出聊一聊js中的'this'关键字

 更新时间:2022年07月12日 15:04:58   作者:航航不脱发  
js中的this关键字平时在开发中使用时倒是也能正常应用,但是对其使用和判断并不能信手拈来,所以下面这篇文章主要给大家介绍了关于js中this关键字的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

前言

在JavaScript中‘this’关键字是一个非常重要的概念,然而许多的初学者们发现深度的理解它却又十分困难,如果你正在或者将要被this折磨,那么现在深呼吸放轻松点,你必须得知道实际上去理解‘this’这个关键字并不难;耐心的看完本文,相信你对‘this’会有更深的理解。下面我们将一起来讨论‘this’关键字的工作原理。

什么是'this'关键字

'this'关键字是为每个执行上下文(每个函数)创建的一个特殊变量;所以一般来说,在使用'this'关键字的函数中,'this'永远是取其所有者的值。换句话的意思就是它指向该函数的所有者。这样听起来很抽象吧,那么你现在只要记住'this'关键字的值不是静态的,所以它总是不一样。它的值取决于函数是怎么被调用的,只有在实际调用函数时才分配它的值。就比如我们将x=4;那么x的值就是4,但是'this'关键字的值取决于函数的调用方式;所以现在我们来分析四种不同的调用函数的方式。

四种方式---1.调用函数的第一种方法是:将函数作为一种方法

Example: this代表一个对象

const bruce={
    name:'bruce',
    birthYear:2001,
    calcAge:function () {
        return 2022-this.birthYear
    }
};
console.log(bruce.calcAge());//21`

在上面的bruce对象里面有一个calcAge()函数,这个函数是一个被附加到了bruce对象里面的函数。所以当我们调用一个方法的时候,calcAge()里面的this将会指向这个对象;换句话来说,this所指的bruce这个对象正在调用这个方法。在代码的最后一行,我们调用了这个函数;在calcAge()函数里面我们使用了this,那么这个this的值应该是什么呢?没错,这个this指的是bruce;所以this.birrhYear==bruce.birthYear==2001。

四种方式---2.调用函数的第二种方法是: 简单的调用函数,不将函数作为方法,不附加到任何对象里面

Example: 此时this=undefined

const calcAge=function(birthYear){
    console.log(2022-birthYear);
    //查看此函数中的this
    console.log(this);
}
calcAge(2001)

结果如下:

像这样常规的调用某个函数,只是简单的调用某个函数,并没有将这个函数添加到任何对象上面;可以这样说这个this没有主人,就是this指的就是window 。但是在严格模式下全局对象无法进行默认绑定,所以导致this只能绑定在undefined上。这就是this的默认绑定规则:

  • this所处的词法作用域在哪里生效this就绑定在哪里。
  • 在严格模式下,全局对象无法进行默认绑定,所以导致this只能绑定在undefined上

四种方式---3.调用函数的第三种方法是:调用箭头函数

箭头函数没有自己的this关键字

Example:

//3.箭头函数的调用
const calcAge= birthYear => {
    console.log(2022-birthYear);
    //查看此函数中的this
    console.log(this);
}
calcAge()

执行结果:

因为箭头函数没有this,所以在箭头函数里面的this是它外层作用域里面的非箭头函数的this,而本例中外层作用域是window,所以这里的this指的是window

四种方式---4.调用函数的第四种方式:该函数被调用作为事件监听器

那么此时的this将会指向处理程序函数所附加到的DOM元素

深入理解this指向的是调用该方法的对象

这就意味着this关键字不会简单的指向在我们编写方法的对象上面。

在第一种函数调用的方式中,因为bruce是调用calaAge()方法的对象,所以此时this是bruce; 那么现在创建一个新对象:

const lucy={
   birthYear:2006,
}

我们都知道函数只是一个值,所以我们可以这样:

const lucy={
    birthYear:2006,
}
lucy.calcAge=bruce.calcAge
console.log(lucy);

结果:

现在lucy里面也有了一个calcAge()方法,我们再来执行lucy.calcAge()

const lucy={
    birthYear:2006,
}
lucy.calcAge=bruce.calcAge
console.log(lucy);
lucy.calcAge()

结果为:

这就说明lucy对象调用calcAge()方法时,此时函数calcAge()方法里面的this指向的是lucy, 即调用该方法的对象。所以this关键字如上面所说,它不是静态的,而是取决于函数的调用方式。

现在我们来定义一个常量y,并将bruce.calcAge()函数赋给它

const y=bruce.calcAge
y()

结果为:

那么此时y()只是作为一个普通函数来进行调用,this是window

小结

this关键字是一个让许多初学者感到困惑的东西,但是总的来说:

1.如果函数是以普通函数(非构造函数)的形式调用,this指的永远都是window

2.如果函数是以方法的形式调用,this就是调用方法的那个对象

总结

到此这篇关于js中this关键字的文章就介绍到这了,更多相关js中this关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ES6新特征数字、数组、字符串

    ES6新特征数字、数组、字符串

    这篇文章主要介绍了es6新特征之数字数组和字符串的相关资料,需要的朋友可以参考下
    2016-10-10
  • 小程序选项卡以及swiper套用(跨页面)

    小程序选项卡以及swiper套用(跨页面)

    这篇文章主要为大家详细介绍了小程序选项卡以及swiper套用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • js内存泄漏场景、如何监控及分析详解

    js内存泄漏场景、如何监控及分析详解

    js内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存,这篇文章主要给大家介绍了关于js内存泄漏场景、如何监控及分析的相关资料,需要的朋友可以参考下
    2021-11-11
  • 一文详解如何处理前端表单验证确保用户输入合法

    一文详解如何处理前端表单验证确保用户输入合法

    这篇文章主要介绍了如何处理前端表单验证确保用户输入合法的相关资料,并分享了最佳实践和常见坑点,通过合理使用这些方法,可以构建出健壮、友好的验证系统,文中给出了详细的代码示例,需要的朋友可以参考下
    2025-03-03
  • echarts实现3d柱状图的2种方式举例

    echarts实现3d柱状图的2种方式举例

    echarts3D效果柱状图的实现,这个太难了,我花了两天终于调成我想要的效果啦,要是官网上有例子就好了,太难调了,下面这篇文章主要给大家介绍了关于echarts实现3d柱状图的2种方式,需要的朋友可以参考下
    2023-02-02
  • js实现横向百叶窗效果网页切换动画效果的方法

    js实现横向百叶窗效果网页切换动画效果的方法

    这篇文章主要介绍了js实现横向百叶窗效果网页切换动画效果的方法,实例分析了javascript实现百叶窗效果的技巧,需要的朋友可以参考下
    2015-03-03
  • livereload工具实现前端可视化开发【推荐】

    livereload工具实现前端可视化开发【推荐】

    本文将介绍一个工具--livereload。这是一款能根据你本地文件(html、css、js)的变化,自动跟踪刷新浏览器的实时刷新工具,有了这个工具,会大大减轻你刷新页面的工作量。下面跟着小编一起来看下吧
    2016-12-12
  • 利用css+原生js制作简单的钟表

    利用css+原生js制作简单的钟表

    这篇文章主要为大家详细介绍了如何利用css+原生js制作简单的钟表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • js 编程笔记 无名函数

    js 编程笔记 无名函数

    无名函数,其中一个作用可能是生成新的函数对象的引用,主要是用于定义。
    2011-06-06
  • Js的Array数组对象详解

    Js的Array数组对象详解

    这篇文章主要针对Js的Array数组对象为大家进行详细的讲解,感兴趣的小伙伴们可以参考一下
    2016-02-02

最新评论