call的其他应用
看一些源码的时候常常发现例如这些的代码
Array.prototype.slice.call(arg)
Object.prototype.toString.call(str)
等等 ,着一些系列的句子,当时的我内心是这样的

问题总是要解决的,各种百度 有木有
最后在网上看到一个大牛的博客,他这样写到
var fun=function () {
console.log(this); //String {0: "m", 1: "e", 2: "n", 3: "g", length: 4, [[PrimitiveValue]]: "meng"}
console.log(this instanceof String); //true
};
fun.call("meng");
这段代码执行方式不难看出,就是this指向了字符串"meng"。
注意这里,我并没有说把"meng"传入到到了方法fun中
在看如下代码
var fun=function (value) {
console.log(value); //undefined
};
fun.call("meng");
返回的结果是undefined,也就是说,只是指向了,并没有“处理”参数,其实想想call的用法,它也该如此。。
好了,基础演戏看完了,各位看官想必也明白了,最后再看下代码的执行效果吧
var obj = {length: 2, 0: "first", 1: "two"};
var result = Array.prototype.slice.call(obj);
console.log(result); //["first", "two"]
result = Object.prototype.toString.call(obj);
console.log(result); //[object Object]
当然也可这样写Array.prototype.slice.call(arg,n)表示从第n项开始截取
这里在补充网上的一种说法:
slice()方法没有参数的话,会从0开始剪切到最后。
所以上面的代码可以这样理解,代码从0剪切到1,结果生成数组,对应的结果就如上了。。
其实这样说的前提是,你得理解slice内部的方法实现。
最最最终奥义:Object.protype.Fun.call(n,m)这种结构,
对n执行Fun(m)。
m不存在,执行Fun默认方法。
思维扩展下,Array.prototype.slice.call(arg)其实可以这样用(临时想到的,感觉可以)
如网上一些数据的解析方式是这样的

用的0,1,2....等数字做的属性名(前两天从php后天获取的数据也是如此),今天学到这个方法后是不是可以这样处理一下
var con1=document.querySelector(".con1");
var result=window.getComputedStyle(con1);
console.log(Array.prototype.slice.call(result[3]).join(""));
当然你也可以这样处理
var con1=document.querySelector(".con1");
var result=window.getComputedStyle(con1);
console.log(result[3]);
返回的结果是一样的
上面的哪一种看着显然麻烦,这里提到主要有两点原因
1,深刻理解下.call()方法
2,为解决问题多一种思路
刚刚又从网上看到了个它的用处
js arguments类型像数组但不是数组,所以也就有了,把arguments转换成数组的方法(插件用它的意义也在于此)

随机推荐
- 高通平台msm8909 LK 实现LCD 兼容
前段时间小米出现红米note2 换屏门,现在我们公司也要上演了:有两个供应商提供不同IC 的LCD panel. 软件区分的办法是读取LCD IC 的ID 寄存器,下面解析高通平台LK中LCD兼容的过 ...
- 关于跨域的ajax
$.getJSON("http://query.yahooapis.com/v1/public/yql?callback=?", { q: "select * from ...
- UVALive 6508 Permutation Graphs
Permutation Graphs Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- [CF355C]Vasya and Robot(思维,贪心)
题目链接:http://codeforces.com/contest/355/problem/C 题意:1~n n个物品各重wi,现在有一个人可以从左边拿和从右边拿, 左边拿一个物品的花费是l*wi, ...
- NFS安装过程
操作环境:linuxmint做客户端--centos7(虚拟机)做服务器 1.先安装需要的包: centos7中:yum install rpcbind && yum install ...
- VS生成事件
源自:http://www.cnblogs.com/FreeDong/p/3406737.html 如果说磨刀不误砍柴工,同样用好Visual Studio,会大大增加咱.NET程序猿效率.本文说的就 ...
- 小C的故事(快速学C语言,,,极速版!)
前几天这篇博客写了太多废话! 删啦~~. 本篇博客只是为chd A协的全嫩小鲜肉入门C语言的预科, 如果你在此处学习C语言, 不幸走火入魔, 小弱概不负责. //请直接随便找个C语言编译器,抄一下下面 ...
- git学习笔记04-将本地仓库添加到GitHub远程仓库-git比svn先进的地方
第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步. 如果没有,打开Shel ...
- SQL SERVER赋权限
--创建登录账户 use master GO EXEC sp_addlogin 'jacky', 'pwd' --EXEC sp_droplogin 'jacky' --删除登陆账户 use Test ...
- parseInt 的第二个参数
["1","2","3"].map(parseInt) //[1,NaN,NaN] ["1","2" ...