前端面试题之:this原理

什么是this

this既不指向自身,也不指函数的词法作用域,它是在函数调用时才发生的绑定。

this绑定

  1. 默认绑定: window。(严格模式下为undefined)
  2. 隐式绑定:绑定给离this最近的对象。
    示例:
var name = '卡卡';
var cat = {
    name:'有鱼',
    eat1:{
        name:'年年',
        eat2:function(){
            console.log(this.name);//年年
        }
    }
}
cat.eat1.eat2();
// eat2方法包含在两个对象cat、eat1中,但是紧挨着的eat1对象,所以this.name指的是eat1的属性name,即[年年];

var eat3 = cat.eat1.eat2;
eat3(); // 卡卡
// 这里需要注意一个情况,如果cat.eat1.eat2这个结果赋值给一个变量eat3,则eat3()的值是多少呢?
// 答案是[卡卡]

这个是因为经过赋值操作时,并未发起函数调用,eat3()这个才是真正的调用,而发起这个调用的是根对象window,所以this指的就是window,this.name=卡卡

  1. 构造函数:实例对象。
  2. 显示绑定:call()、apply、bind(),绑定给指定的对象。
  3. 箭头函数:取决于外层作用域。(箭头函数没有this)
    箭头函数设计的初衷是为了解决函数的二义性(创建实例、执行序列),所以ES6引入了class和箭头函数的概念,class只能通过new来创建实例,而普通函数只能执行一段指令,所以箭头函数初衷就是不能用于创建实例,箭头函数的this不是调用的时候决定的,而是在定义的时候决 定的,所以他内部没有this,继承的是上下文的this。
    参考链接:https://blog.csdn.net/m0_56693499/article/details/135845734
  4. 匿名函数和定时器:指向全局对象window。

原理

原理一: 与函数调用结合
    当一个函数在执行的时候:会创建一个上下文对象,会产生局部作用域
    上下文对象中,函数是被谁调用的;在哪调用的;参数是什么等信息
    this 就是记录一个属性 :在函数被调用时候产生

    函数调用有几种方式
    new
    对象调用
    事件调用
    call,apply或bind

原理二:结合作用域看this
    问题:为什么return 返回 伪对象 数组 函数 this就不指向new 实例化的对象
    原理:函数在执行时候会创建局部作用域:this
    创建一个对象,就是将构造函数的作用域赋给了新对象;
    所以this 指向了这个对象,return {}, [],function 之后;
    改变了作用域,作用域赋值给了 {} function [] 所以this指向{} [] function

参考链接:
https://blog.csdn.net/yukamilo/article/details/107113106
https://zhuanlan.zhihu.com/p/106719732

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值