请教一个this指向的问题

             function foo(){
                console.log(this.a);
            }
            var a = 2;
            var o = {
                a:3, 
                foo: foo
            };
            var p = { a:4 };
            o.foo();  //3
            (p.foo = o.foo)();      //2
            /**
                相当于: 
                function w(){
                    p.foo = o.foo;
                }
                w();
                此时的constructor指向window,调用这个w,这个w是在window下创建的,相当于
                调用window.w(),所以constructor指向window。
            */
 
            p.foo = o.foo;
            p.foo();    //4     函数由p执行,那么constructor指向的就是对象p,谁调用就指向谁0.0
            //this也就指向p, 因此this.a === p.a

想问一下为什么 (p.foo = o.foo)()不是赋值操作吗,为什么会执行呢

阅读 1.5k
2 个回答

赋值语句有返回值,如果调用括号()的左边是引用类型的值,this将设为引用类型值的base对象(base object),左边返回foo,右边()执行,this指向Window,最后输出2

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题