你可能不知道的JavaScript之this指向详解
目录
- 前言
- 默认绑定,全局对象
- 点石成金,隐式绑定
- 隐式绑定丢失
- 指腹为婚,显式绑定
- 内有乾坤,new 绑定
- 军令如山,箭头函数
- this 绑定优先级
- 总结
- 相关文献
- 引用链接
前言
JavaScript 对 this 指向 话题 的理解是永不过时的,鉴于 JavaScript 中 this 风骚的运作方式,本文将试图将其拆解分析,烹饪再食用~。
this is all about context.,大概意思就是:this 与当前执行上下文相关。
this 说白了就是找离自己最近的对象,即拥有当前上下文(context)的对象(context object)。
换句话说,this 与函数被调用时,调用函数的对象有关。
默认绑定,全局对象
正所谓近水楼台先得月,全局对象作为对遥远的对象是作为备胎的存在,为语言边界护城河做兜底。
一般情况下,this 指向全局对象则属于默认绑定。那么什么是默认绑定呢?
this 默认绑定,通俗地可理解为函数被调用时无任何调用前缀对象的情景,由于函数调用时无调用前缀对象或函数无特定绑定,所以非严格模式下此时 this 会指向全局对象。
在非严格模式下,不同终端的全局变量对象有所区别:
• 在浏览器端,this 指向 Window 对象;
• 在 Nodejs 环境,this 指向 global 对象;
• 在函数环境,this 指向 绑定当前函数的作用域;
在严格模式下:
• 在 use strict 环境, this 指向 undefined;
在非严格模式下
{ /* 在非严格模式下,this默认绑定 */ console.log('window global this: ', this); // window function fnOuter() { console.log('fnOuter: ', this); // window } function windowThis() { console.log('windowThis: ', this); // window function fnInner() { console.log('fnInner: ', this); // window fnOuter(); } fnInner(); } windowThis(); }
上述栗子中,无论函数声明在哪,在哪调用,由于函数调用时前面并未指定任何对象,这种情况下 this 均指向全局对象 window。
但须注意的是,在严格模式下,默认绑定下的 this 会指向 undefined。
在严格模式下,再来看几个栗子,然后在心中记下答案
{ /* 在非严格模式下,this默认绑定 */ var mode = '在非严格模式下,this默认绑定'; function windowThis() { console.log('windowThis: ', this); console.log('windowThis: ', this.mode); function fnInner() { console.log('fnInner: ', this); console.log('fnInner: ', this.mode); } fnInner(); } function windowStrictThis() { 'use strict'; windowThis(); function fnInner() { console.log('windowStrictThis: ', this); console.log('windowStrictThis: ', this.mode); } fnInner(); } windowStrictThis(); }
建议得出答案再看下文,
一起来倒数吧,“花栗鼠。。。。。。”。
赞 (0)