##apply call bind 对比分析
1 基本语法,第一个参数必须传入一个对象
|
|
2 三者之间的区别
2.1 bind只绑定方法执行的对象,并不执行方法,改变的是函数的this指向;根据bind的这个特性,经常会结合setTimeout执行
2.2 call apply绑定方法的执行对象的同时,也会直接执行方法;
2.2.1 fun.apply(thisArg[, argsArray])
thisArg
在 fun 函数运行时指定的 this 值。需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
argsArray
一个数组或者类数组 对象,其中的数组元素将作为单独的参数传给 fun 函数 。如果该参数的值为null 或 undefined,则表示不需要传入任何参数。从ECMAScript 5 开始可以使用类数组对象。浏览器兼容性请参阅本文底部内容。
同时除了可以传入一个数组,也可以传入arguments,代表当前函数的参数的一个类数组
如果 argsArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argsArray 和 thisArg 任何一个参数,那么 Global 对象将被用作 thisArg, 并且无法被传递任何参数。
2.2.2 fun.call(thisArg[, arg1[, arg2[, …]]])
如果thisArg指定为null和
undefined的
this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this
会指向该原始值的自动包装对象。
2.3 主要改变函数体执行的时候,函数体内this的指向;
|
|
2.3 call方法传入的参数是参数列表形式的,apply传入的参数必须是数组 形式的
- apply参数数组化的应用场景:求数组最值
|
|
- 如何将一个数组追加到另外一个数组呢?
|
|
或者你也会这么做
|
|
看看apply参数数组化的优势 apply会将数组拆分,将每个元素传入调用的函数push
|
|
- 如何将一个 类数组对象 添加到另外一个 对象 呢?
|
|
下面代码可以看下,看下apply的参数对于数组以及类数组的要求
|
|
- apply操作DOM元素 NodeList类数组
|
|
bind
|
|
3 this的指向
|
|