js的this问题

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());

让控制台出现Aurelio De Rosa,,apply和call,var that=this这3中方法可以吗?用这3种方式具体该怎么写?除了apply和call,var that=this,还有其他的方式吗?求解。谢谢大家

阅读 4.1k
5 个回答

1)

console.log(obj.prop.getFullname());//Aurelio De Rosa 以方法调用方式

2)

var test=obj.prop.getFullname();
console.log(test.apply(obj.prop));//Aurelio De Rosa apply方式调用

3)

var test=obj.prop.getFullname();
console.log(test.call(obj.prop));//Aurelio De Rosa call方式调用

4)

var fullname = 'John Doe';
var obj = {
fullname: 'Colin Ihrig',
prop: (function(){
    var fullname='Aurelio De Rosa';
    return {
        getFullname:function(){
            return fullname;
        }
    }
})()
};
//Aurelio De Rosa 利用闭包使变量私有化

你这里面相当于

var test = function() {
    return this.fullname;
}

所以this指向window了。
可以这么写:
1.直接用 obj.prop调用

console.log(obj.prop.getFullname());

2.调用 test 上下文指向obj.prop

console.log(test.call(obj.prop));
console.log(test.apply(obj.prop));

楼上已经说了基于调用test时的改变,我说基于定义test的改变
1、可以通过将test改变为一个获取getFullname的值逻辑

var test = function(){return obj.prop.getFullname()};

2、使用bind功能

var test = obj.prop.getFullname.bind(obj.prop);

让控制台出现Aurelio De Rosa

obj context 调用 getFullname 就能满足你的需求,apply, call, bind 只是具体实现方式,上面已经回答的很好啦。

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