为什么这两个console.log的值不一样

<script type="text/javascript">
        var fullname = 'John Doe';
        var obj = {
            fullname: 'Colin Ihrig',
            prop: {
                fullname: 'Aurelio De Rosa',
                getFullname: function() {
                    return this.fullname;
                }
            }
        };
        var test = obj.prop.getFullname;
        console.log((test)());
        console.log((obj.prop.getFullname)());
//        John Doe    Aurelio De Rosa
阅读 3.7k
5 个回答

this指向问题,两次运行的this指向不是同一个对象

    var fullname = 'John Doe';
    var obj = {
        fullname: 'Colin Ihrig',
        prop: {
            fullname: 'Aurelio De Rosa',
            getFullname: function() {
                console.log(this);//加上这一句 看看输出的this
                return this.fullname;
            }
        }
    };
    var test = obj.prop.getFullname;
    console.log((test)());
    console.log((obj.prop.getFullname)());

这个很经典的js function的this指向问题了。

当你把getFullname赋值到test的时候,test()执行函数时,函数的this不是指向this,在这里的话,this指向全局,所以得到的是外面那个fullname

而正常通过obj.prop访问并调用到getFullname方法时,this指向obj.prop,所以得到的是Aurelio De Rosa

  • test()中的this为默认绑定,非严格模式下绑定到全局对象

  • obj.prop.getFullname)()中this为隐式绑定,上下文对象为obj.prop

第一次相当于在全局作用域调用

getFullname: function() {
                    return this.fullname;
                }

当你赋值时,实际上此时已经是一个简单的函数了
window.test()
这时候this指向window
第二次相当于对象调用
obj.prop .getFullname

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