【前端面试题】this指向(二)

this是对当前对象的引用:

        1 事件中 ->谁的事件this->谁

        2 定时器 ->window

        3 对象中 ->谁.方法this->谁

        4 构造函数中 ->实例化对象

        5 普通函数中 ->window

昨天写完了前三条面试题,如果感兴趣可以点击如下链接跳转到我昨天写的前端面试题this指向的前三题:【前端面试题】this指向(一)

我们接着往下写:

第四题

原题

//第四题
var o={
    f1:function(){
        console.log(this);
        var f2=function(){
            console.log(this);
        }();
     }
}
o.f1();

运行结果

讲解

第一个this指向当前的类Object:f1

第二个this指向window,因为f2是一个普通函数,普通函数的this指向window

如果想让第二个this指向f2,简单的使用Call方法即可,使用方法如下:

        //第四题
        var o = {
            f1: function () {
                console.log(this);//object
                var f2 = function () {
                    console.log(this);//window
                }();
            }
        }
        o.f1();

        // //改变this指向 使用call方法
        // var o = {
        //     f1: function () {
        //         console.log(this);//object:f1
        //         var f2 = function () {
        //             console.log(this);
        //         }.call(this);//使用call方法改变this指向,this这次就指向object:f1
        //     }
        // }
        // o.f1();

 this指向改变后的结果:

第五题

原题

//第五题
window.a=20;
var obj={
    a:30,
    add:function(){
        this.a+=1
        console.log(this.a);
    }
}
obj.add();
var foo=obj.add;
foo();

运行结果

讲解

我们为了方便理解,在this.a的前面加一个this的输出:

        //第五题
        window.a = 20;
        var obj = {
            a: 30,
            add: function () {
                this.a += 1
                console.log(this);
                console.log(this.a);
            }
        }
        obj.add();
        var foo = obj.add;
        foo();

运行结果如下:

由此可以看出obj.add();这个调用了当前对象下的add方法,所以this指向当前对象,当前对象是obj,所以第一个console.log输出的是obj,第二个console.log输出的是obj.a=31

我们var了一个方法,把obj.add的方法体给了foo,foo();就相当于window.foo();所以第一个this指向window,this.a就是window.a=20+1=21

改进后的代码:

 //第五题
        window.a = 20; 
        var obj = {
            a: 30,
            add: function () {
                this.a += 1
                console.log(this);
                console.log(this.a);
            }
        }
        //obj.add();这个调用了当前对象下的add方法,所以this指向当前对象,当前对象是obj,所以第一个console.log输出的是obj,第二个console.log输出的是obj.a=31
        obj.add();
        //我们var了一个方法,把obj.add的方法体给了foo,foo();就相当于window.foo();所以第一个this指向window,this.a就是window.a=20+1=21
        var foo = obj.add;
        foo();

第六题

原题

//第六题
window.name="ByteDance";
function A(){
    this.name=123
}
A.prototype.getA=function(){
    console.log(this);
    return this.name+1;
}
let a=new A();
let funcA=a.getA;
funcA();

运行结果

讲解

this指向window

this.name+1用了字符串拼接,this.name=window.name=ByteDance,所以this.name+1=ByteDance1

//第六题
        window.name = "ByteDance";
        function A() {
            this.name = 123
        }
        A.prototype.getA = function () {
            console.log(this);//window
            return this.name + 1;//这个this指向// ByteDance1
        }
        let a = new A();//已经实例化对象
        let funcA = a.getA;//把函数赋给funcA
        //this指向在调用的时候确定
        //funcA();
        console.log(funcA());

第七题

原题

//第七题
var number=1;
var obj={
    number:2,
    getNum:function(){
        var number=6;
        return this.number;
    }
}
var getNum=obj.getNum;
console.log(getNum());
console.log(obj.getNum());
console.log(obj.getNum.call());
console.log(obj.getNum.call({number:7}));

执行结果

解析

//第七题   
        var number = 1;
        var obj = {
            number: 2,
            getNum: function () {
                var number = 6;//局部变量,不指向window
                return this.number;//this指向window
                //return number;// 6 6 6 6
            }
        }
        var getNum = obj.getNum;
        console.log(getNum());//1
        console.log(obj.getNum());//2 this指向Object:this.number=2
        console.log(obj.getNum.call());//1 this指向window call指向当前作用域下的对象
        console.log(obj.getNum.call({ number: 7 }));//7

 

欢迎点赞、关注、收藏~

各自攀登,山顶相见!

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二琳爱吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值