一、this的指向分类

分类this指向
普通函数window
构造函数实例对象,原型对象里面的方法也指向实例对象
对象方法该方法所属对象。若对象中的方法为普通函数写法吗,则this指向该方法所属对象,若为箭头函数,则this指向为window
事件绑定函数绑定事件对象
定时器window
立即执行函数window
箭头函数外层作用域中的this(且this指向不可改变)

二、改变函数内部this指向1.函数名称.call(this要指向的,传递的参数1,…)

  • 调用函数,并改变this指向。

    var obj = {    name: 'zs',    age: 18}function fn (a, b) {    console.log(this)// this指向obj这个对象    console.log(a + b)// 6}fn.call(obj, 1, 5)

2.函数名.apply(this要指向的,[传递的参数1,…])

  • 调用函数,并改变this指向,传递的参数必须是数组。

    var arr = [1, 88, 0, 34, 171, 23]// 利用apply传递数组(伪数组),借助数学内置对象求数组最大值/最小值var max = Math.max.apply(Math, arr)console.log(max)// 171var min = Math.min.apply(Math, arr)console.log(min)// 0

3.函数名.bind(this要指向的,传递的参数1,…)

  • 不调用函数,但改变this指向,调用需要fn.bind(…)( )。

    // 获取所有的按钮元素    let btns = document.querySelectorAll('button')    for (let i = 0; i < btns.length; i++) {        btns[i].addEventListener('click', function () {            // 点击后禁用按钮            this.disabled = true            setTimeout(function () {                // 2秒后解除禁用该按钮                this.disable = false            }.bind(this), 2000)        })    }