函数的this指向及更改

87 阅读2分钟

样式代码

<style>
    div {
        width: 100px;
        height: 100px;
        background-color: pink;
    }
</style>

body代码

    <div></div>

1.函数的this指向

每一个函数内部都有一个关键字是 this

重点: 函数内部的 this 只和函数的调用有关, 和函数的定义方式没有任何关系

换句话说: 函数内部的 this 指向谁, 取决于函数的调用方式

在全局定义一个函数, 内部打印一下 this

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

1.1 全局定义的函数直接调用, 此时 this === window

    fn()

1.2将这个函数放在一个对象内部的一个属性中, 此时 this === 调用者

    var obj = {
        a: 1,
        b: 'qwe',
        c: fn
    }
    console.log(obj.a)  // 1
    console.log(obj.c)  // 一个函数
    obj.c()

1.3将这个函数放在定时器中执行, this === window (两个定时器都一样)

    setTimeout(fn, 10)

1.4将这个函数当作 事件处理函数 此时 this === 事件源

    var oDiv = document.querySelector('div')
    oDiv.onclick = fn

2.更改函数的this指向

有三个可以忽略函数本身的 this 指向 转而指向其他地方的 三个方法

call

这个方法是附加在函数调用后面使用, 可以忽略函数本身的 this 指向

语法:

    函数名.call(新的 this 指向, 传递给函数本身的参数1, 传递给函数本身的参数2, 传递给函数本身的参数3, ...)

apply

这个方法是附加在函数调用后面使用, 可以忽略函数本身的 this 指向

语法:

    函数名.apply(新的 this 指向, [传递给函数本身的参数1, 传递给函数本身的参数2, 传递给函数本身的参数3, ...])

bind

这个方法是附加在函数调用后面使用, 可以忽略函数本身的 this 指向

bind 和 call/apply 有一点小区别, 就是 bind 不会立即执行函数, 而是返回一个已经改变了 this 指向的函数

语法:

     var newFn = 函数名.bind(新的 this 指向);      newFn(传递函数需要的参数)

代码

     var obj = { name: 'QF001' }
    function fn(a, b) {
        console.log(a, b)
        console.log(this)
        console.log('手动分割线=============')
    }
    
     // 1. 正常调用
    fn(10, 20)

    // 2. call
    fn.call(obj, 100, 200)

    // 3. apply
    fn.apply(obj, [1000, 2000])

    // 4. bind
    var newFn = fn.bind(obj);
    newFn(10000, 20000)