• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙
  1. 1. 雏形
  2. 2. 对参数的处理
  3. 3. 返回值与完善

实现call方法

2017-11-10 00:56:44
总字数 426
预计阅读时间 1 分钟

call方法在使用一个指定的this值和若干个指定参数值的前提下调用某个函数

常规调用方式

1
2
3
4
5
6
7
8
var obj = {
name : "Sookie",
func : function(msg) {
console.log(this.name + " : " + msg);
}
}
var fn1 = obj.func;
fn1.call(obj, "Hello");

现在如果要尝试实现一个call方法

雏形

1
2
3
4
5
Function.prototype.call2 = function(context) {
context.fn = this;
context.fn();
delete context.fn;
}

初步实现了不传参情况下的函数调用
但是还有不少缺陷

对参数的处理

由于需要处理实际参数 , 而且实际参数的数量又是不确定的
所以我们可以考虑使用eval来执行这个函数

1
2
3
4
5
6
7
8
9
Function.prototype.call2 = function(context) {
context.fn = this;
var args = [];
for(let i=1 ; i<arguments.length ; i++) {
args.push("arguments[" + i + "]");
}
eval("context.fn(" + args + ")");
delete context.fn;
};

比如实际调用函数的时候需要传入2个参数 , 包括前面的context , 所以arguments当中就有3个元素

那么就相当于执行
context.fn(arguments[1], arguments[2])

返回值与完善

还需要处理函数的返回值
另外 , 在我们的call方法当中 , 对上下文对象添加了fn属性 , 最后又删除了它
如果这个对象上原本就有这个属性 , 那么就对这个对象产生了破坏
可以预先把这个对象保存下来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function.prototype.call2 = function(context) {
var _fn = null;
var flag = false;
if("fn" in context) {
_fn = context.fn;
}
_fn = context.fn;
context.fn = this;
var args = [];
for(let i=1 ; i<arguments.length ; i++) {
args.push("arguments[" + i + "]");
}
var result = eval("context.fn(" + args + ")");
if(flag) {
context.fn = _fn;
} else {
delete context.fn;
}
return result;
};
  • JavaScript
  • prototype
  • JavaScript

扫一扫,分享到微信

HTML5的缓存策略
Maven(5)-jetty-plugin 
© 2024 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
  • 所有文章
  • 友情链接
  • 关于我
{{searchItem.query}}
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • flutter
  • dart
  • git
  • 版本控制
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • Java
  • JavaScript
  • MongoDB
  • flutter
  • Git
  • linux
  • react
  • 前端杂烩
  • 男生女生
  • 算法
  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆