一、apply、call、bind三者的区别
方法:
- Function.prototype.apply(thisArg, argArray)
- Function.prototype.call(thisArg[, arg1[, arg2, …]])
- Function.prototype.bind(thisArg[, arg1[, arg2, …]])
相同点:
- 三个方法的作用都是
改变函数内部this的指向
- 三个方法的
第一个参数都是this要指向的值
- 三个方法都可以传入
额外的参数
- 在
非严格模式
下如果,thisArg为null或undefined
,则this指向window
;
在非严格模式
下,如果thisArg为原始值
(数字、字符串、布尔值),则this指向该原始值的包装对象
;
在严格模式
下,this都指向thisArg本身;
不同点:
- apply和call在调用的时候,函数会立即执行,而bind会返回一个新函数
- apply和call在IE8及以上都支持,bind仅在IE9及以上支持
- Function.prototype.apply.length为2,Function.prototype.call.length和Function.prototype.bind.length的值为1
二、apply、call、bind作用机制
apply
在调用apply方法的时候将执行以下步骤:
call
在调用apply方法的时候将执行以下步骤:
bind
在调用bind方法的时候将执行以下步骤: