bind,call,apply的区别
这是一道经典的面试题了。然鹅我一直都不知道他们三者区别。。。
所以今天学习下。
首先,他们三者都是改变this指向的。
在react当中,常常看到以下场景:
1 | handleFn(id = 0) { |
这是一个很常见的使用方法了,假如上面li
的点击,不通过bind
去绑定this
,那么在函数handleClick
中,this
会为undefined
。现在通过bind
去改变this
指向来避免handleClick
中的this
为空。
正常来说onClick
中需要接收一个函数。所以假如用handleFn
代替handleClick
那么上面的写法就是:
1 | list.map(item => <li key={item.id} onClick={this.handleFn}>{item.id}</li>) |
也就是说this.handleClick.bind(this, item.id)
这里返回的是一个函数。
而它的第一个参数为this
指向的对象,后面则为多个参数this.handleClick.bind(this, arg1, arg2, ..., argx)
跟bind
不同,call
以及apply
则是直接调用方法。而call
跟apply
之间的区别就是接收参数不一样。
1 | var name = '小红', |
可以从上述例子看到,call
跟apply
都是直接调用方法。apply
将所有参数,以数组的形式放在第二个参数上;而call
则跟bind
一样排列放置参数。
总结:
方式 | 返回 | 参数格式 |
---|---|---|
bind | 改变指向后的函数 | this, arg1, arg2, …, argx |
call | 无 | this, arg1, arg2, …, argx |
apply | 无 | this, [arg1, arg2, …, argx] |
参考文章:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 墨陌默!
评论