很多人被JavaScript的this搞晕过。但真相是:它一点都不魔法,只是引擎自动传的一个隐式参数。
和你显式声明的参数(比如function log(smth)里的smth)一样,this也是参数。区别只在于:显式参数由你决定传什么,隐式参数由引擎按固定规则决定。这5条规则,按顺序判断:
![]()
第1步:是箭头函数吗?
箭头函数不接收this参数。你在里面访问this,引擎会像找普通变量一样,去外层作用域(闭包)里找。无论你怎么调用、是否严格模式、甚至.bind过,都不影响——箭头函数的this只看定义时的上下文。
第2步:被.bind/.call/.apply修改过吗?
如果函数被.bind()包了一层,或用.call()/.apply()调用,this就是你指定的那个值。这是唯一能让你"强行指定"this的方式。
第3步:被new调用当构造函数了吗?
如果前面两条都不满足,且函数是new User()这样调用的,this指向新创建的那个实例对象。
第4步:作为对象方法通过点号调用的吗?
如果前面都不满足,且是obj.method()这种形式,this就是点号前面的那个对象。
第5步:以上都不是
普通函数直接调用(如func()):严格模式下this是undefined,非严格模式是全局对象(浏览器里是window)。
就这五步,从上到下依次判断。遇到第一条满足的条件就停止,答案就出来了。下次再看到this的面试题,按这个流程走一遍,不会再懵。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.