call、apply、bind 作用是改变函数执行时的上下文,简而言之就是改变函数运行时的 this 指向
区别
apply
apply 接受两个参数,第一个参数是 this 的指向,第二个参数是函数接受的参数,以数组的形式传改变 this 指向后原函数会立即执行,且此方法只是临时改变 this 指向一次
当第一个参数为 null、undefined 的时候,默认指向 window(在浏览器中)
call
call 方法的第一个参数也是 this 的指向,后面传入的是一个参数列表
跟 apply 一样,改变 this 指向后原函数会立即执行,且此方法只是临时改变 this 指向一次
同样的,当第一个参数为 null、undefined 的时候,默认指向 window(在浏览器中)
bind
bind方法和cal很相似,第一参数也是 this 的指向,后面传入的也是一个参数列表(但是这个参数列表可以分多次传入)
改变 this 指向后不会立即执行,而是返回一个永久改变 this 指向的函数
当然的,当第一个参数为 null、undefined 的时候,默认指向 window(在浏览器中)
不难看出三者之间的异同
- apply、call、bind 都能起到改变函数的 this 对象指向的作用,且当第一个参数为 null,undefined 时,默认指向 window;但 bind 可以起到永久修改的作用
- 三者都可以传参,但是 apply是数组,而call是参数列表,且apply和call 是一次性传入参数,而 bind 可以分为多次传入
bind 实现
Function.prototype.recodeBind = function (context) { if (typeof (context) !== 'function') { throw new TypeError('recodeBind needs to be a function'); } const args = [...arguments].slice(1) const fn = this return function Fn() { return fn.apply(this instanceof Fn ? new Fn(...arguments) : context, args.concat(...arguments)) } }
标签:指向,call,bind,JavaScript,参数,apply,null From: https://www.cnblogs.com/xxaxf/p/18416044