首页 > 其他分享 >this指向详解

this指向详解

时间:2024-02-27 22:36:40浏览次数:20  
标签:function ... console 函数 指向 详解 log

JavaScript 中的 this 是一个关键字,它在不同的情况下会指向不同的值。this 的取值是在函数(非箭头函数)被调用时确定的,而不是在函数被定义时确定的。

1.全局上下文中:

在全局上下文中,this 指向全局对象,在浏览器中通常是 window 对象。

  console.log(this) //window

 

2.函数中:

在普通函数中,this 的取值取决于函数的调用方式:

1).如果函数作为普通函数调用,this 指向全局对象(非严格模式下)或者 undefined(严格模式下)。

2).如果函数作为对象的方法调用,this 指向调用该方法的对象。

 function fn() {
        console.log('函数中的this', this) //window
    }
    fn()

    let obj = {
        fn: function () {
            console.log('对象中的函数this指向', this) //obj
        }
    }
    obj.fn()

 

3.箭头函数中:

箭头函数的 this 不会因为调用方式而改变,而是根据外层(函数或全局)作用域来决定。

1).如果箭头函数在全局作用域中,this 将指向全局对象。

2).如果箭头函数在其他函数内部,this 将指向最近一层非箭头函数的 this 的值,或者如果没有,则指向全局对象。

    let obj2 = {
        fn: () => {
            console.log('对象中箭头函数的this指向', this) //window
        }
    }
    obj2.fn()

    function fa() {

        let a = {
            fn: () => {
                console.log('函数里箭头函数的this指向', this) //{a: 1}
            }
        }
        a.fn()
    }
    fa.call({
        a: 1
    })

 

4.构造函数中:

当一个函数被用作构造函数(使用 new 关键字)时,this 指向新创建的实例对象。

    function Func() {
        this.a = '1',
            this.asthis = function () {
                console.log('构造函数的This', this)
                return this
            }
    }

    let obj3 = new Func()
    obj3.asthis()
    console.log(obj3 === obj3.asthis()) //true

 

5.事件处理函数中:

当函数作为事件处理函数被调用时,this 通常指向触发事件的元素。

    let div = document.querySelector('div')
    div.addEventListener('click', function () {
        console.log('点击事件的this指向', this) //<div id="div"></div>
    })

 

6.call()、apply()、bind()方法中:

可以使用 call()apply()bind() 方法显式地指定函数内部的 this 指向的对象。

//    (1) call() 方法:

    function fb(...params) {
        console.log('fb的this指向:', this)
        console.log('fb的参数', ...params)
    }
    fb.call({}, 1, 2, 3)

    // call() 方法是函数对象的一个方法,它可以在调用函数的同时指定函数内部 this 的值,并且可以传入多个参数列表。
    // 语法:func.call(thisArg, arg1, arg2, ...)
    // thisArg 是在调用函数时将被绑定到函数内部的 this 上下文的值,后续的参数则是传入函数的参数列表。


    //     (2)apply() 方法:

    function fc(...params) {
        console.log('fc的this指向:', this)
        console.log('fc的参数', ...params)
    }
    fc.apply({
        b: 1
    }, [4, 5, 6])

    // apply() 方法与 call() 类似,但它接受的参数是以数组的形式传入的。
    // 语法:func.apply(thisArg, [argsArray])
    // thisArg 是在调用函数时将被绑定到函数内部的 this 上下文的值,argsArray 是一个数组,其中包含了要传入函数的参数。


    //     (3)bind() 方法:

    function fe(...params){
        console.log('fe的this指向:', this)
        console.log('fe的参数', ...params)
    }
    fe.bind({c:2},1,5,8)()

    // bind() 方法不会立即执行函数,而是返回一个新的函数,该函数的 this 值被绑定到 bind() 的第一个参数,其余的参数将作为固定参数传递给原函数。
    // 语法:newFunc = func.bind(thisArg, arg1, arg2, ...)
    // thisArg 是在调用新函数时将被绑定到函数内部的 this 上下文的值,后续的参数被视为固定参数,它们将会被传递给原函数。

 

标签:function,...,console,函数,指向,详解,log
From: https://www.cnblogs.com/qinlinkun/p/18038563

相关文章

  • 详解在 centos 中引导到救援模式
    详解在centos中引导到救援模式Linux系统CentOS进入单用户模式和救援模式详解一、概述目前在运维日常工作中,经常会遇到服务器异常断电、忘记root密码、系统引导文件损坏无法进入系统等等操作系统层面的问题,给运维带来诸多不便,现将上述现象的解决方法和大家分享一下,本次主要以C......
  • Hyperledger Fabric出块配置详解
    HyperledgerFabric的出块主要是Orderer节点负责,出块配置位于创世区块中,支持定时出块、达到一定交易数出块两种条件。出块配置位于configtx.yaml中,修改出块配置后需要重新生成创世区块。相关参数若需要修改fabric的出块机制,则需要调整以下配置参数:BatchTimeout:出块超时时间,最......
  • Qt 常见数据结构详解:从基本框架到实际应用
    在Qt框架中,数据结构的选择对于提高代码效率和性能至关重要。正确地使用数据结构可以显著提高应用程序的效率和响应速度。下面我们将详细介绍Qt中常见的几种数据结构,包括QString、QList、QVector、QMap、QHash、QSet和QPair。1.QStringQString是Qt中用于处理字符串的类。......
  • 详解 git stash
    gitstash详解gitstash命令及其参数功能。在Git中,stash是一种暂存工作区更改的方法,它允许您暂时保存未提交的更改,并将当前工作目录恢复到上次提交的状态。这对于需要切换分支处理其他问题、或者当前工作尚未完成但需要清理工作区以拉取或合并其他分支时非常有用。以下是......
  • android 混淆规则作用,Android代码混淆详解
    一、混淆的意义混淆代码并不是让代码无法被反编译,而是将代码中的类、方法、变量等信息进行重命名,把它们改成一些毫无意义的名字,同时也可以移除未被使用的类、方法、变量等。所以直观的看,通过混淆可以提高程序的安全性,增加逆向工程的难度,同时也有效缩减了apk的体积。总结如下:1、......
  • 转:Linux文件权限详解
    Linux文件权限详解_linux文件权限-CSDN博客掌握Linux文件权限,看这篇就够了-知乎(zhihu.com)  ......
  • pom.xml详解
    pom.xml是Maven项目的核心配置文件,用于描述项目的基本信息、依赖关系、构建配置等。下面是对pom.xml文件中常见元素的详解:<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocat......
  • [转载]详解Mysql innoDB意向锁的作用
    前言InnoDB支持多粒度锁(multiplegranularitylocking),它允许行级锁与表级锁共存,而意向锁就是其中的一种表锁。意向锁(IntentionLocks)需要强调一下,意向锁是一种不与行级锁冲突表级锁,这一点非常重要。意向锁分为两种:意向共享锁(intentionsharedlock,IS):事务有意向对表中的某......
  • 多线程系列(十) -ReadWriteLock用法详解
    一、摘要在上篇文章中,我们讲到ReentrantLock可以保证了只有一个线程能执行加锁的代码。但是有些时候,这种保护显的有点过头,比如下面这个方法,它仅仅就是只读取数据,不修改数据,它实际上允许多个线程同时调用的。publicclassCounter{privatefinalLocklock=newReentra......
  • 机器学习策略篇:详解单一数字评估指标(Single number evaluation metric)
    单一数字评估指标无论是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,会发现,如果有一个单实数评估指标,进展会快得多,它可以快速告诉,新尝试的手段比之前的手段好还是差。所以当团队开始进行机器学习项目时,经常推荐他们为问题设置一个单实数评估指标。......