每天一道面试题--- js 中 this 指针的用法

普通this指针指向问问题:

  • 1.预编译过程中的this–>window

  • 2.全局作用域中的this–>window

  • 3.一般情况下的this–>调用者(谁调用指向谁);

  • 4.call/apply,改变this指向,指向第一个参数

  • 5.object.function(){} this–>object;

  • 6.普通函数中的this,是window;

  • 7.对象.方法中的this是当前对象;

  • 8.定时器的this是window;

  • 9.构造函数中的this是实例对象;

  • 10.原型对象中的this是实例对象。

  • 全局环境下的this

    • 在全局环境下,this指针始终指向的全局对象(window);

    console.log(this===window);//true

第一题:

var x = 3;

var foo = {
    x: 2,
    baz: {
        x: 1,
        bar: function() {
            return this.x;
        }
    }
}

var go = foo.baz.bar;

alert(go());
alert(foo.baz.bar());
  • 1,2
  • 1,3
  • 2,1
  • 2,3
  • 3,1
  • 3,2

答案:3,1
解答:

var go = foo.baz.bar;  --> go = this.x   ---> go 的作用域是全局,所以是 window。
this指向执行时刻的作用域,go的作用域是全局,所以相当于window,取到的就是window.x,也就是var x=3;这里定义的x。
foo.baz.bar()  ---->
而foo.baz.bar()里面,this指向foo.baz,所以取到的是这个上面的x,也就是1

第二题:

var x = 4,
    obj = {
        x: 3,
        bar: function() {
            var x = 2;
            setTimeout(function() {
                var x = 1;
                alert(this.x);
            }, 1000);
        }
    };
obj.bar();
  • 1
  • 2
  • 3
  • 4
  • undefined

答案:4
解答:
4,不管有这个setTimeout还是把这个函数立即执行,它里面这个function都是孤立的,this只能是全局的window,即使不延时,改成立即执行结果同样是4。

第三题

x = 1;
function bar() {
    this.x = 2;
    return x;
}
var foo = new bar();
alert(foo.x);
  • 1
  • 2
  • undefined

答案:2
这里主要问题是最外面x的定义,试试把x=1改成x={},结果会不同的。这是为什么呢?
在把函数当作构造器使用的时候,如果手动返回了一个值,

  • 要看这个值是否简单类型,如果是,等同于不写返回,
  • 如果不是简单类型,得到的就是手动返回的值。
  • 如果,不手动写返回值,就会默认从原型创建一个对象用于返回。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值