• js基础:this的指向


    this是什么

    JavaScript this 关键词指的是它所属的对象。

    this的指向

    • 在函数体中,非显式或隐式地简单调用函数时,在严格模式 下,函数内的this会被绑定到undefined上,在非严格模式下则会被绑定到全局对象window/global上。
    • 一般使用new方法调用构造函数时,构造函数内的this会被绑定到新创建的对象上。
    • 一般通过call/apply/bind方法显示调用函数时,函数体内的 this会被绑定到指定参数的对象上。
    • 一般通过上下文对象调用函数时,函数体内的this会被绑定到该对象上。
    • 在箭头函数中,this的指向是由外层(函数或全局)作用域来决定的

    全局环境中的this

    • 在函数体中,非显式或隐式地简单调用函数时,在严格模式 下,函数内的this会被绑定到undefined上,在非严格模式下则会被绑定到全局对象window/global上。

    例子1:

        function f1() {
            console.log(this);
        }
        function f2() {
            "use strict";
            console.log(this);
        }
        f1(); // window
        f2(); // undefined
    

    例子2:

        var foo = {
            bar: 10,
            fn: function() {
                console.log(this)
                console.log(this.bar)
            }
        }
        var fn1 = foo.fn
        fn1()
    // window
    // undefined
    

    上下文对象调用中的this

    • this指向最后调用它的对象

    例子3:

        var foo = {
            bar: 10,
            fn: function() {
                console.log(this)
                console.log(this.bar)
            }
        }
        foo.fn()
    

    image-20210104132008085

    例子4:

        var person = {
            name: 'Lucas',
            brother: {
                name: 'Mike',
                fn: function() {
                    return this.name
                }
            }
        }
        console.log(person.brother.fn())// Mike
    // 最后的this指向的是brother
    

    例子5:

        var o1 = {
            text: 'o1',
            fn: function() {
                return this.text
            }
        }
        var o2 = {
            text: 'o2',
            fn: function() {
                return o1.fn()
            }
        }
        var o3 = {
            text: 'o3',
            fn: function() {
                var fn = o1.fn
                return fn()
            }
        }
        console.log(o1.fn()) //o1
        console.log(o2.fn()) //o1
        console.log(o3.fn()) //undefined  此时this为window,没有text
    

    例子5(在例子4的基础上加上了严格模式):

        var o1 = {
            text: 'o1',
            fn: function() {
                "use strict";
                return this.text
            }
        }
        var o2 = {
            text: 'o2',
            fn: function() {
                return o1.fn()
            }
        }
        var o3 = {
            text: 'o3',
            fn: function() {
                var fn = o1.fn
                return fn()
            }
        }
        console.log(o1.fn()) //o1
        console.log(o2.fn()) //o1
        console.log(o3.fn()) //error
    

    关于前两种情况,建议参考彻底理解js中的this,可以直接理解

    通过bind、call、apply改变this指向

    • 一般通过call/apply/bind方法显示调用函数时,函数体内的 this会被绑定到指定参数的对象上。

    例子6:

        const foo = {
            name: 'lucas',
            logName: function() {
                console.log(this.name)
            }
        }
        const bar = {
            name: 'mike'
        }
        foo.logName.call(bar) // mike
    

    构造函数中的this

    • 一般使用new方法调用构造函数时,构造函数内的this会被绑定到新创建的对象上。

    例子7:

        function Foo() {
            this.bar = "Lucas"
        }
        const instance = new Foo()
        console.log(instance.bar)  // Lucas
    

    事件绑定中的this

    • 事件源.onclik = function(){ } //this -> 事件源
    • 事件源.addEventListener(function(){ }) //this->事件源

    例子8:

    	var div = document.querySelector('div'); 
        div.addEventListener('click',function() {
            console.log(this); //this->div
        });
        
        div.onclick = function() {
        console.log(this) //this->div
        }
    

    定时器中的this

    • 定时器中的this->window,因为定时器中采用回调函数作为处理函数,而回调函数的this->window

    • 箭头函数使用this 不适用以上标准规则,而是根据外层(函数 或者全局)上下文来决定。

    例子9:

        const foo = {
            fn: function(){
                setTimeout(function() {
                    console.log(this)
                })
            }
        }
        foo.fn() // window
    

    例子10:

        const foo = {
            fn: function(){
                setTimeout(()=>{
                    console.log(this)
                })
            }
        }
        foo.fn() //{fn:f}
    

    参考:

    https://www.cnblogs.com/lingXie/p/11493723.html

    https://blog.csdn.net/chen_junfeng/article/details/109235442

  • 相关阅读:
    2020最新版Springcloud-Alibaba ZooKeeper篇(三)
    2020最新版SpringCloud(H版&alibaba)框架开发教程(二)
    2020最新版SpringCloud(H版&alibaba)框架开发教程(一)
    String StringBuffer StringBuilder详细分析和面试题
    算法-一个经典sql 题和一个Java算法题
    大数据开发-Flume-频繁产生小文件原因和处理
    大数据开发-Hive-常用日期函数&&日期连续题sql套路
    MapReduce怎么优雅地实现全局排序
    intelliJ IDEA 鼠标光标消失问题
    maven依赖问题的出现原因与解决方式
  • 原文地址:https://www.cnblogs.com/cpaulyz/p/14229360.html
Copyright © 2020-2023  润新知