apply 和 call
-
func.apply(thisArg, [argsArray]) // 第一个参数:必选,第二个:可选
-
function.call(thisArg, arg1, arg2, ...)
-
apply 传入的第一个参数 指定this的指向 第二个参数是一个数组(接收传递过来的参数)
-
call 传入的第一个参数 指定this的指向 后面的参数是 传递给函数的参数
const arr = [1,6,3,5,29,8,7] let maxNumber = Math.max.apply(Math,arr) let maxNummer = Math.max.call(Math,...arr)
-
apply 改变this 指向 并传入参数(数组)
-
call改变this指向 并传入参数(一个一个的参数)
例:伪数组使用数组方法
var domNodes =Array.prototyope.slice.call(document.getElementsByTagName("*)
同理也可以将数组的一些方法通过 apply 或者 call 的 方法 给其他伪数组使用
function log(){ var args = Array.prototype.slice.call(arguments) args.unshift('app') }
-
call/apply都是返回函数执行的结果
-
辅助记忆:
apply
是以a
开头,它传给function
的参数是Array
,也是以a
开头的 -
调用
call
/apply
/bind
的必须是个函数
apply、call、bind之间的区别
call和apply的唯一区别:
传给function的参数写法不同:
apply
是第2个参数,这个参数是一个数组,要传的参数都写在数组里call
从第2~n的参数都是传给function
的
call/apply 与 bind的区别
执行:
- call/apply 改变了函数的this上下文后,马上执行该函数
- bind则是返回改变了上次文后的函数,不执行该函数
返回值:
- call/apply返回
function
的执行结果 - bind返回
function
的拷贝,并指定里function
的this指向,保存了function
的参数
call和apply的应用场景
-
判断数据类型:
Object.prototype.toString
用来判断类型再合适不过,借用它我们几乎可以判断所有类型的数据:function isType(data, type) { const typeObj = { '[object String]': 'string', '[object Number]': 'number', '[object Boolean]': 'boolean', '[object Null]': 'null', '[object Undefined]': 'undefined', '[object Object]': 'object', '[object Array]': 'array', '[object Function]': 'function', '[object Date]': 'date', // Object.prototype.toString.call(new Date()) '[object RegExp]': 'regExp', '[object Map]': 'map', '[object Set]': 'set', '[object HTMLDivElement]': 'dom', // document.querySelector('#app')<