this指向是个老生常谈的话题
最近读了JS忍者秘籍及博客介绍,就先写下
假如有人问你this指向那里,你可以说:我也不知道.
首先要想知道this的指向,首先得知道this是什么.
当一个函数被调用时,会创建一个活动记录,有时也叫执行上下文,这个记录会包含函数在哪里被调用(调用栈)、函数的调用方式,传入的参数信息,this就是这个记录属性
—–你不知道的JS上卷
this是函数在调用时,除了函数的显参,还传入了叫做this的隐参(还有另一个叫做arguments)
this参数引用了该函数调用进行隐式关联的一个对象叫做函数的上下文function context而函数上下文是一个概念,在JS语言中,this依赖于函数的调用方式
因此将this 称为调用上下文更好理解(invocation context)
—-JavaScript忍者秘籍
this绑定和函数声明的位置没有任何关系只取决于函数的调用方式.
this既不指向函数自身也不指向函数的词法作用域.他是在函数被调用时发生的绑定,指向完全取决于函数在哪里被调用.
-----你不知道的JS上卷
作为函数进行调用
JS中允许函数作为函数进行调用,区别于其他的调用机制:方法,构造器,apply/call,如果函数没有通过,方法构造器,或者apply()/call()进行调用,我们可以认为它是”作为函数”进行调用,通常发生在函数使用()操作符进行调用的时候.
此时(普通函数,定时器函数,立即执行函数)this指向全局上下文–window对象
—-JavaScript忍者秘籍
作为方法进行调用
将函数作为对象的一个方法method进行调用时,那么该对象变成了函数上下文.通俗解释的说,作为对象的一个方法进行调用时候,this指向这个拥有这个方法的对象(方法所属的对象).
—-JavaScript忍者秘籍
作为构造器constructor进行调用
构造器调用时就会发生:
创建一个新的对象
传递给构造器的对象是this参数,从而称为构造器的函数上下文
如果没有显示的返回值,新创建的对象则作为构造器的返回值进行返回
—-JavaScript忍者秘籍
构造器的目的就是要去创造一个新对象并对其进行设置,然后将构造器的返回值进行返回.任何干扰这种意图的函数都不时候作为构造器.
即当函数作为构造器进行调用时候,
this指向是对象,原型对象里的方法也指向实例对象