this, call, apply 和 bind

2023-10-28
2分钟阅读时长

this

在JavaScript中,关键字this用于引用当前执行上下文中的对象。它是一个特殊的关键字,其值取决于函数的调用方式。

  • 全局上下文中的this:在全局作用域中,this指向全局对象,在浏览器环境中通常是window对象,在Node.js环境中是global对象。

  • 函数上下文中的this:在函数内部,this的值取决于函数的调用方式。

    • 普通函数调用:当函数作为普通函数调用时,this指向全局对象(浏览器环境下是window,Node.js环境下是global)。
    • 对象方法调用:当函数作为对象的方法调用时,this指向调用该方法的对象。
    • 构造函数调用:当函数用作构造函数创建对象时,this指向新创建的实例对象。
    • call()和apply()调用:通过call()或apply()方法可以显式地设置函数内部的this指向。call()和apply()的第一个参数就是要设置的this的值。
    • 箭头函数中的this:箭头函数没有自己的this绑定,它会捕获外层作用域中的this值,因此箭头函数的this与外层作用域的this相同。

需要注意的是,this的值在函数执行时确定,并且可以动态改变。如果在一个嵌套的函数中使用this,需要特别小心,因为this的指向可能会发生变化。

call、apply 和 bind

call、apply 和 bind 都是 Function.prototype 上的方法,它们的作用都是改变函数的 this 指向。

call

call 方法的作用是调用一个函数,并且将一个指定的对象绑定到 this 上,然后按照给定的参数列表执行该函数。语法如下:

fn.call(thisArg, arg1, arg2, ...)

其中,thisArg 是要绑定到函数 this 的对象,arg1、arg2 等是函数的参数。

apply

apply 方法和 call 方法类似,区别在于它接收的是一个数组或类数组对象作为参数列表,语法如下:

fn.apply(thisArg, [argsArray])

其中,argsArray 是一个数组或类数组对象,包含了要传递给函数的参数。

bind

bind 方法的作用是创建一个新函数,并将一个指定的对象绑定到 this 上,但不会立即执行该函数,而是返回一个新函数。语法如下:

fn.bind(thisArg, arg1, arg2, ...)

其中,thisArg 是要绑定到函数 this 的对象,arg1、arg2 等是函数的参数。