Maison  >  Questions et réponses  >  le corps du texte

javascript - 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,还有其他的方式吗?求解。谢谢大家

PHP中文网PHP中文网2750 Il y a quelques jours213

répondre à tous(5)je répondrai

  • PHPz

    PHPz2017-04-10 15:18:35

    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 利用闭包使变量私有化
    

    répondre
    0
  • 迷茫

    迷茫2017-04-10 15:18:35

    你这里面相当于

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

    répondre
    0
  • PHPz

    PHPz2017-04-10 15:18:35

    http://www.zhihu.com/question/20289071

    répondre
    0
  • 迷茫

    迷茫2017-04-10 15:18:35

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

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

    2、使用bind功能

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

    répondre
    0
  • 黄舟

    黄舟2017-04-10 15:18:35

    让控制台出现Aurelio De Rosa

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

    répondre
    0
  • Annulerrépondre