博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【build your own xxx】实现你自己的call和apply
阅读量:6414 次
发布时间:2019-06-23

本文共 1690 字,大约阅读时间需要 5 分钟。

新开一个坑,起名为【build your xxx】,自己造一些小轮子。 工作中不要重复造轮子,但是以学习的目的去造轮子却意义重大。 之前貌似在知乎上看到一个问题是说如何使用JavaScript实现它原生的call和apply方法,今天我来实现一番。

call

首先看看call是干什么的,从MDN上扒一张图:

举个例子

function showName(gender, age){    	console.log(this.name, " ", gender, " ", age)    }    var obj = {        name: "亚古"    }    showName.call(obj, "female", 22)// 亚古   female   22复制代码

梳理思路

可以看出来Func.call(obj, arg1, arg2...)实现了这么几件事:

  1. 以obj.Func的方式调用
  2. 把参数arg1, arg2 ...传递给Func
  3. 不对obj和Func造成副作用

实现

Function.prototype.Zcall = function (othis) {        othis.fn = this;        othis.fn();	}    showName.Zcall(obj) // 亚古   undefined   undefined复制代码

第一个步骤已经实现了,但是很明显的是这样子会对传入的othis造成副作用,即给othis对象无缘无故添加了一个方法,所以:

Function.prototype.Zcall = function (othis) {        othis.fn = this;        othis.fn();        delete othis.fn;    }复制代码

副作用已经消除了,接下来就是参数的问题,这里有个问题是参数个数是不定的,貌似可以使用一个数组来arr保存住arguments里面的参数,然后再执行othis.fn(arr)。但是,这样等于说只给fn传了一个数组参数,并不能达到目的。

此时问题转化为我们如何实现像 othis.fn(arguments[0], arguments, arguments ...) 这样的语句呢? 此时可以想起一个不怎么常用的方法eval

简单的说就是可以把字符串解析为JavaScript语句来执行。 借助eval,改写
Zcall方法:

Function.prototype.Zcall = function (othis) {		othis.fn = this;		let args = [];		for(let i = 1, len = arguments.length;i < len;i++) {			args.push("arguments[" + i + "]");		}		// othis.fn();		eval("othis.fn(" + args + ")");		delete othis.fn;	}复制代码

其实就是用args把arguments用字符串的方式保存住,然后在eval方法中再把字符串重新解析为语句。

apply

同理来实现apply:

Function.prototype.Zapply = function (othis) {		othis.fn = this;		let argsArr = arguments[1];		if (!arguments[1]) {			let args = [];			for(let i = 0, len = arguments[1].length;i < len;i++) {				args.push("arguments[1][" + i + "]");			}			eval("othis.fn(" + args + ")");		}else{			othis.fn();		}				delete othis.fn;	}复制代码

参考资料:

转载地址:http://ordra.baihongyu.com/

你可能感兴趣的文章
让虚拟机的软盘盘符不显示(适用于所有windows系统包括Windows Server)
查看>>
Cygwin不好用
查看>>
jQuery插件之验证控件jquery.validate.js
查看>>
[经验]无线鼠标和无线键盘真的不能用了?——雷柏的重生之路~
查看>>
【转】plist涉及到沙盒的一个问题
查看>>
GNU make manual 翻译( 一百四十五)
查看>>
重构之美-走在Web标准化设计的路上[复杂表单]3 9 Update
查看>>
linux中的优先搜索树的实现--prio_tree【转】
查看>>
转载: 打造自己的asp.net验证控件
查看>>
重构之美-跨越Web标准,触碰语义网[开门见山:Microformat]
查看>>
git入门与实践【转】
查看>>
WPF 虚拟键盘
查看>>
储存卡无法打开专家教您怎么数据恢复
查看>>
彼得原理
查看>>
如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库...
查看>>
[20171113]修改表结构删除列相关问题3.txt
查看>>
特征选择
查看>>
在Winform程序中设置管理员权限及为用户组添加写入权限
查看>>
RTMP直播到FMS中的AAC音频直播
查看>>
多能互补提速 加快我国能源转型和现代能源体系建设
查看>>