美文网首页程序员深入理解JavaScript的一些事
04 深入理解ES6箭头函数this处理

04 深入理解ES6箭头函数this处理

作者: 陈柯梦 | 来源:发表于2019-01-08 23:47 被阅读0次

    演示代码

    <html>
        <body>
            <script type="text/javascript">
            "use strict"
            //看清函数内this本质
            var foo = {
                x:1,
                y:function(){
                    console.log(`foo this ===>${this.x}`);
                    this.x = 2;
                    console.log(`foo this ===>${this.x}`);
                }
            }
            console.log(`-----foo.y()-------`)
            foo.y();
            console.log(`foo.x ==>${foo.x}`)
            //foo.y 与this.foo.y本质相同,foo属于全局域中定义的属性,所以foo.y实际调用的是this.foo.y
            //而y中this表示this指针,受调用方影响,该处实际指向的是this.foo的this
            //所以当调用foo.y()时,y中this.x操作的都是foo中的x属性
            console.log(`-----this.foo.y()-------`)
            this.foo.y();
            console.log(`this.foo.x ==>${this.foo.x}`)
            //构造函数本质是创建了对象空间,var f = new foo.y(),表示创建了foo.y对象,并赋值给f,此处f受foo.y返回值影响
            //此时new foo.y()为object对象,所以y中this.x开始是不存在的,执行this.x=2后才为创建了x属性
            //该处的x为new foo.y()的属性与foo.x是两码事,而this只是执行构造函数时的临时对象
            console.log(`-----var f = new foo.y()-------`)
            var f = new foo.y();
            console.log(`f.x ===>${f.x}`);
            console.log(`this.f.x ===>${this.f.x}`);
            console.log(`-----var r = {x:10,y:null}-------`)
            var r = {x:10,y:new foo.y()};
            console.log(`r.x ==>${r.x}`);
            console.log(`r.y.x ==>${r.y.x}`);
    
            //搞清楚this的本质后,es6的箭头函数解决了this受调用方影响问题,
            //其本质类似typescript中编译时重写this,
            //this.x = 2 ==> var self = this.y;self.x = 2
            var fuc = {
                x:1,
                y:()=>{
                    console.log(`fuc this ===>${this.x}`);
                    this.x = 2;
                    console.log(`fuc this ===>${this.x}`);
                }
            }
            console.log(`-----y:()=>{this.x = 2}-------`)
            fuc.y();
            console.log(`fuc.x ===>${fuc.x}`);
    
            var fuc2 = {
                x:1,
                y:function(){
                    var self = this.y;
                    console.log(`fuc2 this ===>${self.x}`);
                    self.x = 2;
                    console.log(`fuc2 this ===>${self.x}`);
                }
            }
            console.log(`-----y:()=>{self.x = 2}-------`)
            fuc2.y();
            console.log(`fuc2.x ===>${fuc2.x}`);
            </script>
        </body>
    </html>
    

    这个例子是对JavaScript中this的深入理解,并对深入理解function&构造函数篇的补充,同时理解ES6中箭头函数对this的优化

    看清函数内this本质

    var foo = {
        x:1,
        y:function(){
            console.log(`foo this ===>${this.x}`);
            this.x = 2;
            console.log(`foo this ===>${this.x}`);
        }
    }
    console.log(`-----foo.y()-------`)
    foo.y();
    console.log(`foo.x ==>${foo.x}`)
    
    console.log(`-----this.foo.y()-------`)
    this.foo.y();
    console.log(`this.foo.x ==>${this.foo.x}`)
    

    foo.y 与this.foo.y本质相同,foo属于全局域中定义的属性,所以foo.y实际调用的是this.foo.y,而y中this表示this指针,受调用方影响,该处this实际指向的是this.foo的this,所以当调用foo.y()时,y中this.x操作的都是foo中的x属性

    构造函数本质是创建了对象空间

    console.log(`-----var f = new foo.y()-------`)
    var f = new foo.y();
    console.log(`f.x ===>${f.x}`);
    console.log(`this.f.x ===>${this.f.x}`);
    console.log(`-----var r = {x:10,y:null}-------`)
    var r = {x:10,y:new foo.y()};
    console.log(`r.x ==>${r.x}`);
    console.log(`r.y.x ==>${r.y.x}`);
    

    构造函数本质是创建了对象空间,var f = new foo.y(),表示创建了foo.y对象,并赋值给f,此处f受foo.y返回值影响,参考深入理解function&构造函数篇。此时new foo.y()为object对象,所以y中this.x开始是不存在的,执行this.x=2后才创建了x属性,该处的x为new foo.y()的属性与foo.x是两码事,而this只是执行构造函数时的临时对象

    es6的箭头函数解决了this受调用方影响问题

    var fuc = {
        x:1,
        y:()=>{
            console.log(`fuc this ===>${this.x}`);
            this.x = 2;
            console.log(`fuc this ===>${this.x}`);
        }
    }
    console.log(`-----y:()=>{this.x = 2}-------`)
    fuc.y();
    console.log(`fuc.x ===>${fuc.x}`);
    
    var fuc2 = {
        x:1,
        y:function(){
            var self = this.y;
            console.log(`fuc2 this ===>${self.x}`);
            self.x = 2;
            console.log(`fuc2 this ===>${self.x}`);
        }
    }
    console.log(`-----y:()=>{self.x = 2}-------`)
    fuc2.y();
    console.log(`fuc2.x ===>${fuc2.x}`);
    

    搞清楚this的本质后,es6的箭头函数解决了this受调用方影响问题,其本质类似typescript中编译时重写this,this.x = 2 ==> var self = this.y;self.x = 2

    相关文章

      网友评论

        本文标题:04 深入理解ES6箭头函数this处理

        本文链接:https://www.haomeiwen.com/subject/ubvirqtx.html