从实现原理更深入了解call和apply

一、原理的粗糙实现

1. call
Function.prototype.call = function(x){
  x = x || '{}';
  x.fn = this;
  var i;
  var args = [];
  for(i = 1;  i < arguments.length; i++){
    args.push(arguments[i]);
  }
  var func = function(thisArg, args){
    var str = args.join(',');
    return thisArg.fn(str);
  }
  var result = func(x, args);
  delete x.fn;
  return result;
} 
2. apply
Function.prototype.apply = function(){
  x = x || '{}';
  x.fn = this;
  var i;
  var args = [];
  for(i = 1;  i < arguments[1].length; i++){
    args.push(arguments[i]);
  }      
  var func = function(thisArg, args){
    var str = args.join(',');
    return thisArg.fn(str);
  }
  var result = func(x, args);
  delete x.fn;
  return result;
}

二、以apply为例讲解实现的过程

假设现在有cat和dog两个对象:

var cat = {
    name: 'cat',
    printName: function(){
        console.log(this.name);
    }
}
var dog = {
    name: 'dog'
}

使用上面的apply:

cat.printName.apply(dog); // dog

现在分析代码的执行过程:

  1. 调用apply函数进入apply函数内部
  2. x.fn = this 就是 dog.fn = cat.printName
  3. 执行x.fn(); 输出this.name,而此时this为dog,所以代码输出dog

三、重新看之前的Function.prototype.call.apply(null, arguments)

那么它的执行过程就是:

  1. 调用apply函数进入apply函数内部
  2. x = null || {} 将 x变成{}
  3. x.fn = this 就是 {}.fn = Function.prototype.call
  4. 执行x.fn(arguments); 就是{}.call(arguments);
  5. 进入call内部
  6. x.fn = this 就是 arguments[0].fn = {}
  7. 执行x.fn(arguments[1-n]) 由于fn={}不是函数,所以报错

总结:call和apply需要由函数来调用,不能使用对象调用call和apply

参考文章:
https://blog.csdn.net/THEANARKH/article/details/54393176

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,697评论 0赞 13
  • 一切皆对象 js中的一个常见运算符 typeof 以上代码列出了 typeof 输出的集中类型标识, 其中上面的四...
    无迹落花阅读 2,115评论 0赞 5
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 8,239评论 2赞 17
  • “看!你男神在那里!” “你小声点,等下被他听见怎么办!” “唉呀,没关系啦,喜欢就要让他知道嘛!万一他也喜欢你呢...
    lionakes阅读 255评论 0赞 0
  • 见了一个同学。初中同学,同桌,高中同学; 记得在上高中的时候,我当时也还比较落魄,他同我一样有种凤凰掉进鸡窝里的感...
    橘子侠阅读 394评论 2赞 1

友情链接更多精彩内容