apply、call、bind学习和总结

在JavaScript中,call、apply和bind是function对象自带的三个方法。

(1)call方法:

语法

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

call( ) 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法。

当调用一个函数时,可以赋值一个不同的 this 对象。this 引用当前对象,即 call 方法的第一个参数。

需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。

使用call方法调用函数并指定上下文'this':

apply、call、bind学习和总结_第1张图片

调用其它对象的方法完成对自身的操作:

apply、call、bind学习和总结_第2张图片

(2)apply方法:

语法:

fun.apply(thisArg[, argsArray])

语法与 call() 方法的语法几乎完全相同,唯一的区别在于,apply的第二个参数必须是一个包含多个参数的数组(或类数组对象)。

在调用一个存在的函数时,可以为其指定一个 this 对象。 this 指当前对象,也就是正在调用这个函数的对象。使用 apply,可以只写一次这个方法然后在另一个对象中继承它,而不用在新对象中重复写该方法。

需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。argsArray是一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 fun 函数。如果该参数的值为null 或undefined,则表示不需要传入任何参数。

例子:

apply、call、bind学习和总结_第3张图片

使用Math.max/Math.min来找出一个数组中的最大/最小值

 

分享一些常用的用法:

  1. 数组之间追加

  1. 获取数组中的最大值和最小值

apply、call、bind学习和总结_第4张图片

  1. 验证是否是数组(前提是toString()方法没有被重写过)

(3)bind方法:

语法:

fun.bind(thisArg[, arg1[, arg2[, ...]]])

           bind是ES5新增的一个方法,传参和call或apply类似,不会执行对应的函数,call或apply会自动执行对应的函数,返回对函数的引用。

bind() 函数会创建一个新函数(称为绑定函数),新函数与被调函数(绑定函数的目标函数)具有相同的函数体。当新函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。绑定函数被调用时,bind() 也接受预设的参数提供给原函数。一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。

例子:

apply、call、bind学习和总结_第5张图片

PS:  在fun函数运行时指定的this值。需要注意的是下面几种情况:

(1)不传,或者传null,undefined,函数中的this指向window对象 。
(2)传递另一个函数的函数名,函数中的this指向这个函数的引用,并不一定是该函数执行时真正的this值 。
(3)值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象,如 String、Number、Boolean 。
(4)传递一个对象,函数中的this指向这个对象。

总结call,apply,bind

  1. 三者都是用来改变函数的this对象的指向的。
  2. 三者第一个参数都是this要指向的对象,也就是想指定的上下文,上下文就是指调用函数的那个对象。
  3. 三者都可以传参,但是apply是数组,而call是有顺序的传入。
  4. bind 是返回对应函数,便于稍后调用;apply 、call 则是立即执行。

 

你可能感兴趣的:(apply、call、bind学习和总结)