0


详解JS中关于call、apply和bind的实现(源码实现)

在JavaScript中,call、apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向。

call、apply、bind方法的共同点:
1.都是用来改变函数的this对象的指向的;

2.第一个参数都是this要指向的对象;

3.可以利用后续参数传参;

区别:

bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。

call()方法和apply()方法的作用相同,区别仅在于接受参数的方式不同。

一、call的源码实现

  1. //call源码实现
  2. function demo(){
  3. console.log(this);
  4. console.log(arguments);
  5. }
  6. var obj = {
  7. neme:"lcy",
  8. age:2
  9. }
  10. Function.prototype.myCall = function(){
  11. //找出第一个参数,判断第一个参数是否为空,如果为空this还是指向window
  12. var target = arguments[0] || window//短路运算
  13. //获取传递的参数
  14. var _arg = Array.from(arguments).slice(1)
  15. target.fn = this;
  16. target.fn(..._arg);
  17. //删除fn属性
  18. delete target.fn;
  19. }
  20. demo.myCall(obj,1,2,3)
  21. // demo.call(obj,1,2,3);

二、apply的源码实现

  1. //apply源码实现
  2. function demo(){
  3. console.log(this);
  4. console.log(arguments);
  5. }
  6. var obj = {
  7. neme:"lcy",
  8. age:2
  9. }
  10. Function.prototype.myApply = function(){
  11. //找出第一个参数,判断第一个参数是否为空,如果为空this还是指向window
  12. var target = arguments[0] || window//短路运算
  13. //获取传递的参数
  14. var _arg = arguments[1]
  15. target.fn = this;
  16. target.fn(..._arg);
  17. //删除fn属性
  18. delete target.fn;
  19. }
  20. demo.myApply(obj,[1,3,3])
  21. // demo.apply(obj,[1,2,3]);

三、bind的源码实现

  1. // bind源码实现
  2. function demo(){
  3. console.log(this);
  4. console.log(arguments);
  5. }
  6. var obj = {
  7. neme:"lcy",
  8. age:2
  9. }
  10. Function.prototype.myBind = function(){
  11. //记录函数的this指向
  12. var target = arguments[0] || window;
  13. //获取传递的参数
  14. var _args = Array.from(arguments).slice(1);
  15. //记录调用bind的函数
  16. var that = this;
  17. //返回一个新函数
  18. return function(){
  19. if(!new.target){
  20. var arg = Array.from(arguments);
  21. //拼接参数
  22. arg = _args.concat(arg);
  23. target.fn = that;
  24. target.fn(...arg);
  25. delete target.fn;
  26. }else{
  27. return new that();
  28. }
  29. }
  30. }
  31. var fn = demo.myBind(obj,1,2);
  32. fn(3,4);
  33. // var fn1 = demo.bind(obj,1,2);
  34. // fn1(3,4)

这个记录下来为了方便以后使用的方便,也希望大佬们多多交流,多多留言,指出我的不足的之处啦!

有需要的小伙伴可以研究研究啦!!


本文转载自: https://blog.csdn.net/A20201130/article/details/122871397
版权归原作者 土豆切成丝 所有, 如有侵权,请联系我们删除。

“详解JS中关于call、apply和bind的实现(源码实现)”的评论:

还没有评论