• 【学习笔记49】JavaScript的this指向


    一、this指向

    • 每一个函数内部都有一个关键字this
    • this的值, 和函数的调用有关, 与函数书写无关

    1. 普通调用方式

    • 一个普通的全局函数, 在正常调用的情况下, this === window
            function fn() {
                console.log(this);  
            }
    
            fn()    // this === window
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    2. 函数放置到对象

    • 如果将函数放置到对象, 通过对象的语法去获取到并调用, 那么this === 对象
            function fn() {
                console.log(this);  
            }
    
            // 将函数fn赋值给对象obj的c属性, fn和obj.c是一个引用地址
            var obj = {
                a: 1,
                b: '我是对象obj的属性B',
                c: fn
            }
            obj.c()  // this === obj     this指向了调用者
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    3. 事件处理函数

    • 如果将函数作为事件处理函数, 那么触发的时候, 内部的this指向了事件源
            <div id="box">div>
        
            <style>
            #box {
                width: 50px;
                height: 50px;
                background-color: rgb(235, 135, 223);
            }
        style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
            function fn() {
                console.log(this);  
            }
    
            var box = document.getElementById('box');
            box.onclick = fn    // this === box    this指向了事件源
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    4. 计时器

    • 如果将函数作为定时器执行时的函数, 那么触发的时候, 内部的this指向了全局对象window
            function fn() {
                console.log(this);  
            }
    
            setTimeout(fn, 0);      // this === window
            setInterval(fn, 1000);  // this === window
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    二、改变this指向

    • 需求: 我想让这个函数在不改变结构的情况下, 让其内部的 this === obj
            var obj = {
                a: 1,
                b: 2,
                c: '我是对象obj的属性c'
            }
    
            function fn(x, y) {
                console.log(this, x, y)
            }
            fn(100, 200)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    1. call()

    • 语法: 函数.call(this指向谁, 参数1, 参数2, 参数3...)
    • 第二个位置的参数, 会传递到函数中
            var obj = {
                a: 1,
                b: 2,
                c: '我是对象obj的属性c'
            }
    
            function fn(x, y) {
                console.log(this, x, y);
            }
            fn(100, 200)
    
            fn.call(obj, 300, 400)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    2. apply()

    • 语法:函数.apply(this指向谁, [参数1, 参数2, 参数3])
    • 第二个位置的数组内数据, 会传递到函数内部
            var obj = {
                a: 1,
                b: 2,
                c: '我是对象obj的属性c'
            }
    
            function fn(x, y) {
                console.log(this, x, y);
            }
            fn(100, 200)
    
            fn.apply(obj, [500, 600]);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    3. bind()

    • 语法:函数.bind(this指向谁, 参数1, 参数2, 参数3...)
    • 第二个位置的参数开始, 会传递到函数中
    • 注意: bind 方法不会立即执行函数, 他会返回一个内部this修改完毕的新函数
            var obj = {
                a: 1,
                b: 2,
                c: '我是对象obj的属性c'
            }
    
            function fn(x, y) {
                console.log(this, x, y);
            }
            fn(100, 200)
    
            var newFn = fn.bind(obj, 700, 800);
            newFn()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

  • 相关阅读:
    LVGL介绍
    day29IO流(其他流)
    云原生 | Docker - [常用镜像]
    NFT交易平台开发 创建NFT数字藏品平台
    【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】神经元和人工神经网络
    解密Vue中key的神奇原理:优化列表渲染效率的关键策略!
    springmvc复习(第二天)(黑马版)
    快速了解Spring Cache
    大数据在线实习项目能收获什么呢?
    Linux ARM平台开发系列讲解(IIC) 2.7.1 IIC总线驱动框架分析
  • 原文地址:https://blog.csdn.net/m0_58190023/article/details/128073703