Skip to content

this

在浏览器平台下运行 JS ,非函数当中的this 一般都指向 window。 因此这里讨论的是函数执行过程中的 this 需要注意在 ES6+ 的箭头函数中是没有自己this的,处理机制是使用自己上下文里的 this

this是什么

this 就是当前函数执行的主体(谁执行了函数),不等于执行上下文,当前作用域

常见this场景

  1. 事件绑定
  2. 普通函数
  3. 构造函数
  4. 箭头函数
  5. 基于 call/bind/apply 强制改变 this 指向

规律

  1. 事件绑定
    1. 不论是DOM2还是 DOM0 事件绑定,事件触发时this一般都是被操作的元素
  2. 普通函数
    1. 函数执行时查看前面是否有点,如果有点,则点前面的就是执行主体,没有点就是 window,严格模式下是 undefined
    2. 特殊情况
      1. 匿名函数中的 this 是 window 或者 undefined
      2. 回调函数中的 this 一般也是window或者 undefined
      3. 小括号语法
        1. 如果小括号只有一项,则相当于没加
        2. 如果小括号当中有多项,则取出最后一项,此时相当于拷贝函数,所以调用时主体是 window

this 练习

js
(function () {
  console.log(this)
})()

let arr = [1, 3, 5, 7]
obj = {
  name: '跳跳'
}
arr.map(function (item, index) {
  console.log(this)
}, obj)
------------------------------------------------------
//? 普通函数调用
let obj = {
  fn: function () {
    console.log(this, 111)
  }
}
let fn = obj.fn;
fn()  // window
obj.fn();  // obj
(10, fn, obj.fn)();
------------------------------------------------------
var a = 3, 
  obj = { a: 5 }
obj.fn = (function () { 
  this.a *= ++a
  return function (b) {
    this.a *= (++a) + b
    console.log(a)
  }
})();
var fn = obj.fn  
obj.fn(6)
fn(4)
console.log(obj.a, a)

Released under the MIT License.