• this全面解析<转>


    先搞明白一个很重要的概念 —— this的值是在执行的时候才能确认,定义的时候不能确认!

    为什么呢 —— 因为this是执行上下文环境的一部分,而执行上下文需要在代码执行之前确定,而不是定义的时候。

    看如下例子:

    // 情况1 
    function foo() {
        console.log(this.a) //1 
    }
    var a = 1
    foo();
    
    // 情况2 
    function fn() {
        console.log(this);
    }
    var obj = { fn: fn };
    obj.fn(); //this->obj 
    
    // 情况3 
    function CreateJsPerson(name, age) {
        //this是当前类的一个实例p1 
        this.name = name; //=>p1.name=name 
        this.age = age; //=>p1.age=age 
    }
    var p1 = new CreateJsPerson("尹华芝", 48);
    
    // 情况4 
    function add(c, d) {
        return this.a + this.b + c + d;
    }
    var o = { a: 1, b: 3 };
    add.call(o, 5, 7); // 1 + 3 + 5 + 7 = 16 
    add.apply(o, [10, 20]); // 1 + 3 + 10 + 20 = 34 
    
    // 情况5 
    <button id="btn1">箭头函数 this</button>
    <script type="text/javascript">
        let btn1 = document.getElementById('btn1');
        let obj = {
            name: 'kobe',
            age: 39 ,
            getName: function() {
                btn1.onclick = () => {
                    console.log(this); //obj 
                };
            }
        };
        obj.getName ();
    </script>

    接下来我们逐一解释上面几种情况

    • 对于直接调用 foo 来说,不管 foo 函数被放在了什么地方,this 一定是 window

    • 对于 obj.foo() 来说,我们只需要记住,谁调用了函数,谁就是 this,所以在这个场景下 foo 函数中的 this 就是 obj 对象

    • 在构造函数模式中,类中(函数体中)出现的this.xxx=xxx中的this是当前类的一个实例

    • call、apply和bind:this 是第一个参数

    • 箭头函数this指向:箭头函数没有自己的this,看其外层的是否有函数,如果有,外层函数的this就是内部箭头函数的this,如果没有,则this是window。

    注:首先,new 的方式优先级最高,接下来是 bind 这些函数,然后是 obj.foo() 这种调用方式,最后是 foo 这种调用方式,同时,箭头函数的 this 一旦被绑定,就不会再被任何方式所改变。

     注:转自前端工匠

    地址:https://mp.weixin.qq.com/s/WfEOY57Trq6JD1CO2VSYWA

  • 相关阅读:
    seeting菜单界面形成--优化
    setting菜单界面的形成--未优化
    (转)最强Android模拟器genymotion的安装与配置
    (转)Android SlidingTabLayout定制分割线和指示条颜色
    【前端】CSS入门笔记
    【前端】XHTML入门笔记
    【Java】Java学习笔记
    【英语】20141022 生词
    【学习】Git和Github菜鸟入门
    【英语】20141015 生词
  • 原文地址:https://www.cnblogs.com/princesong/p/11827161.html
Copyright © 2020-2023  润新知