call,apply,bind区别
JavaScript 为我们专门提供了一些函数方法来帮我们更优雅的处理函数内部this
的指向问题,常用的有 bind()
、call()
、apply()
三种方法。
call,apply,bind的基本介绍
语法:
fun.call(thisArg, param1, param2, ...)//参数为第2~n
fun.apply(thisArg, [param1,param2,...])//参数为数组
fun.bind(thisArg, param1, param2, ...)//不执行该函数
返回值:
call/apply:fun
执行的结果 bind:返回fun
的拷贝,并拥有指定的this
值和初始参数
参数
thisArg
(可选):
- 若thisArg存在,
fun
的this
指向thisArg
对象 - 非严格模式下:若thisArg指定为null,undefined,fun中的this指向window对象.
- 严格模式下:
fun
的this
为指定的null或undefined - 值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象,如 String、Number、Boolean
在
严格模式
下和非严格模式
下,this
有所区别:// 非严格模式
fn.call(); // this -> window
fn.call(null); // this -> window
fn.call(undefined); // this -> window
// 严格模式
fn.call(); // this -> undefined
fn.call(null); // this -> null
fn.call(undefined); // this -> undefined
调用call
/apply
/bind
的必须是个函数
区别:
-
共同点:都可以改变
this
指向 -
不同点:
call()
和apply()
会调用函数,并且改变函数内部this
指向.call()
和apply()
传递的参数不一样,call()
传递参数使用逗号隔开,apply()
使用数组传递bind()
不会调用函数,可以改变函数内部this
指向
-
应用场景
call()
经常做继承apply()
经常跟数组有关系,比如借助于数学对象实现数组最大值最小值bind()
不调用函数,但是还想改变this
指向,比如改变定时器内部的this
指向
call() | apply() | bind() | |
---|---|---|---|
相同点 | 改变函数this 指向 | 改变函数this 指向 | 改变函数this 指向 |
是否调用函数 | 是 | 是 | 否 |
传递参数 | 逗号, 隔开 | 数组形式[] | 逗号, 隔开 |
应用场景 | 参数数量/顺序确定就用call | 与数组有关 | 不想调用函数 |
阅读剩余
版权声明:
作者:chun
链接:https://chun53.top/358.html
文章版权归作者所有,未经允许请勿转载。
THE END