JavaScript全解析——this指向

本系列内容为JS全解析,为千锋教育资深前端老师独家创作

致力于为大家讲解清晰JavaScript相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【点个关注】持续追更~

this指向(掌握)

this 是一个关键字,是一个使用在作用域内的关键字

作用域分为全局作用域和局部作用域(私有作用域或者函数作用域)

全局作用域

全局作用域中this指向window

局部作用域

函数内的 this, 和 函数如何定义没有关系, 和 函数在哪定义也没有关系,只看函数是如何被调用的(箭头函数除外)

可分为以下场景:

普通函数中调用

普通函数中的this和全局调用一样,this指向window

语法:函数名()

<script>
    // 全局使用 this 
    console.log(this) //window 
    console.log(window) //window 
    console.log(window === this) //true 
    //普通函数调用 
    function fn() { 
        console.log('我是全局 fn 函数') 
        console.log(this) //window 
    } 
    fn() 
</script>

对象(包含数组)中调用

该函数内的 this 指向 前面的内容,也就是那个对象或者数组

语法:

对象名.函数名()*

对象名

<script> 
    //对象函数调用 
    function fn() { 
        console.log(this) //{fun: ƒ} 
    } 
    var obj = { 
        fun: fn 
    } 
    obj.fun() 
    obj['fun']() 
</script>

定时器处理函数中调用

定时器中的this同样也是指向window

<script> 
    // 定时器处理函数 
    setTimeout(function() { 
        console.log(this); //window 
    }, 1000) 
</script>

事件处理程序中调用

事件处理程序中的this指向的是事件源

<!DOCTYPE html> 
<html lang="en"> 

<head> 
   <meta charset="UTF-8"> 
   <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
   <meta name="viewport" content="width=device-width, initial-scale=1.0">        <title>Document</title> 
   <style> 
       div { 
           width: 200px; 
           height: 200px; 
           background-color: red; 
        } 
    </style> 
</head> 

<body> 
   <div>hello world</div> 
   <script> 
       var res = document.querySelector('div') 
       
       res.onclick = function() { 
           console.log(this); //<div></div>
       } 
   </script> 
</body> 

</html>

自执行函数中调用

●自执行函数中的this也指向window

<script> 
    (function() { 
        console.log(this); //window 
    })() 
</script>

强行改变this指向

通过上面的学习大家知道,this在不同的情况指向是不同的,但是有时候需要指向一个制定的对象,这就需要改变this的指向

可以理解成不管之前指向哪里,现在我让你指向哪里你就要指向哪里

强行改变this指向的方式可以通过call、apply和bind来改变

call调用

作用:改变函数内部this的指向

语法:

函数名.call()

对象名.函数名.call(参数1,参数2,参数3...)

参数:

○第一个参数是this要指向的对象

○从第二个参数开始,依次给函数传递实参

特点: 会立即调用函数或者说立即执行

<script> 
    function fn(a, b) { 
        console.group('fn 函数内的 打印') 
        console.log('this : ', this) 
        console.log('a : ', a) 
        console.log('b : ', b) 
        console.groupEnd() 
    } 
    var obj = { 
        name: '我是 obj 对象' 
    } 
    var arr = [100, 200, 300, 400, 500] 
    // 用 call 调用 
    fn.call(obj, 100, 200) 
    fn.call(arr, 1000, 2000) 
    /* 
    this : {name: '我是 obj 对象'} 
    a : 100 
    b : 200 
    fn 函数内的 打印 
    this : (5) [100, 200, 300, 400, 500] 
    a : 1000 
    b : 2000 
    */ 
</script>

apply调用

作用: 改变函数内部this的指向

语法:

○函数名.apply()
○对象名.函数名.apply(参数1,[参数2,参数3...])

参数:

○第一个参数是this要指向的对象

○第二参数的一个数组,要传递的实参要放到数组里面,就是有一个实参也要放到数组里面

特点: 会立即调用函数或者说立即执行

<script> 
    function fn(a, b) { 
        console.group('fn 函数内的 打印') 
        console.log('this : ', this) 
        console.log('a : ', a) 
        console.log('b : ', b) 
        console.groupEnd() 
     } 
     var obj = { 
         name: '我是 obj 对象' 
     } 
     var arr = [100, 200, 300, 400, 500] 
     // 用 apply 调用 
     fn.apply(obj, [100, 200]) 
     fn.apply(arr, [1000, 2000]) 
     /* 
     fn 函数内的 打印 
      this : {name: '我是 obj 对象'} 
      a : 100 
      b : 200 
      fn 函数内的 打印 
      this : (5) [100, 200, 300, 400, 500] 
      a : 1000 
      b : 2000 
      */ 
</script>

bind调用

作用: 改变函数内部this的指向

语法:

函数名.bind()

对象名.函数名.bind(参数1,参数2,参数3...)

参数:

第一个参数是this要指向的对象

从第二个参数开始,依次给函数传递实参

特点: 函数不会立即调用,会返回一个改变this指向以后的函数,使用的时候需要调用

<script> 
    function fn(a, b) { 
        console.group('fn 函数内的 打印') 
        console.log('this : ', this) 
        console.log('a : ', a) 
        console.log('b : ', b) 
        console.groupEnd() 
     } 
     var obj = { 
         name: '我是 obj 对象' 
     } 
     var arr = [100, 200, 300, 400, 500] 
     // 用 bind 调用 
     // 注意: 因为是 bind, 不会把 fn 函数执行, 而是把 fn 
     // res 接受的就是 bind 方法复制出来的 fn 函数, 和 fn 
     var res = fn.bind(obj, 100, 200) 
     var res1 = fn.bind(arr, 1000, 2000) 
     res() 
     res1() 
     /* 
     fn 函数内的 打印 
     this : {name: '我是 obj 对象'} 
     a : 100 
     b : 200 
     fn 函数内的 打印 
     this : (5) [100, 200, 300, 400, 500] 
     a : 1000 
     b : 2000 
     */ 
</script>

以上即为JS中this指向的一些基础知识点,更多技术干货、知识技巧可以关注我们!有不清楚的问题也可以在评论区交流讨论,也可以私信小千~

原文链接:https://www.cnblogs.com/qian-fen/p/17391354.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript全解析——this指向 - Python技术站

(0)
上一篇 2023年5月11日
下一篇 2023年5月11日

相关文章

  • 在JavaScript中对HTML进行反转义详解

    在JavaScript中,将HTML内容插入到页面上时,有时需要对HTML进行转义,以防止其中包含的特殊字符污染页面结构或导致安全隐患。而有时候,我们需要对已经进行了转义的HTML内容进行反转义,重新获得原始HTML内容。接下来,我将为大家详细讲解在JavaScript中对HTML进行反转义的完整攻略。 什么是HTML转义? HTML转义指的是将HTML标签…

    JavaScript 2023年5月19日
    00
  • js中this的指向问题归纳总结

    绝大部分的新手,在学习JavaScript时都会遇到一个非常常见的问题:无法理解 this 的指向问题。这也是Javascript的一个复杂和有争议性的部分,本攻略旨在帮助读者归纳总结“js中this的指向问题”。 什么是 this this 是 JavaScript 中的一个关键字,它是一个对象,并且它是由函数来调用的。this 的值在每个函数调用的时候都…

    JavaScript 2023年6月10日
    00
  • 使用 Opentype.js 生成字体子集的实例代码详解

    使用 Opentype.js 生成字体子集的实例代码详解 什么是 Opentype.js Opentype.js 是一个 JavaScript 库,主要用于解析和操作 OpenType 字体。通过使用 Opentype.js,我们可以将 OpenType 字体嵌入到 Web 页面中,并对其进行各种操作,如显示、排版、模糊和旋转等。 什么是字体子集 字体子集是…

    JavaScript 2023年5月27日
    00
  • 原生JS:Date对象全面解析

    原生JS:Date对象全面解析 什么是Date对象 Date 对象是 JavaScript 中的内置对象,用于处理日期和时间。可以使用 new 关键字实例化一个 Date 对象。 var now = new Date(); 上述代码会返回一个 Date 对象,表示当前的日期和时间。 Date对象的方法和属性 获取年份,月份和日期 Date 对象提供了获取其表…

    JavaScript 2023年5月27日
    00
  • javascript日期操作详解(脚本之家整理)

    我来给您提供详细讲解“JavaScript日期操作详解(脚本之家整理)”的完整攻略。 JavaScript日期对象 JavaScript内置了Date对象来处理日期和时间。可以使用Date对象创建一个日期对象,日期对象表示一个特定的时刻。 创建日期对象 可以使用构造函数创建一个日期对象: var date1 = new Date(); 可以使用一个整数值表示…

    JavaScript 2023年5月27日
    00
  • js判断为空Null与字符串为空简写方法

    JS判断为空Null与字符串为空的简写方法是前端开发中常用且重要的技巧,本文将提供完整的攻略和示例演示。 JS判断为空Null的方法 判断JS变量是否为空Null,常用的方法有两种: 1. 严格相等“===”比较 使用严格相等“===”运算符判断变量是否等于null即可,样例代码如下: let variable = null; if (variable ==…

    JavaScript 2023年5月28日
    00
  • js截取字符串功能的实现方法

    下面是关于JS字符串截取功能的实现方法攻略: 一、JavaScript截取字符串的substr()方法 substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。 语法: string.substr(start,length) 其中: start 是一个非负整数,表示想要开始抽取的位置 length 是一个非负整数,表示抽取的字符个数 …

    JavaScript 2023年5月28日
    00
  • 网站程序中非SI漏洞的利用

    非SI漏洞指的是与系统集成无关的漏洞,这些漏洞通常存在于特定的网站程序中,可以被攻击者利用来访问受保护的文件、执行命令或者绕过身份验证等。以下是针对网站程序中非SI漏洞的利用的完整攻略。 准备工作 在开始攻击之前,需要进行以下准备工作: 确认目标网站程序的版本信息。 收集目标网站程序的相关信息,包括文件路径、参数名称、请求方式等。 准备必要的工具和软件,如B…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部