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转换成数组的方法(插件用它的意义也在于此)

随机推荐
- 课务IOS概述_1
1.网络 2.多线程 3.各种图形 4.动画 5.面向对象的数据库 Preconditions: 1.CS106 A和B 或CS106X 2.CS107或CS108更好 3.CS110就更好了 熟 ...
- CodeForces 651B Beautiful Paintings 贪心
A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- PHP判断用户设备是否是移动设备
摘自http://www.oschina.net/code/snippet_1432190_46913 <?php function isMobile() { // 如果有HTTP_X_WA ...
- (1)创建一个叫做机动车的类: 属性:车牌号(String),车速(int),载重量(double) 功能:加速(车速自增)、减速(车速自减)、修改车牌号,查询车的载重量。 编写两个构造方法:一个没有形参,在方法中将车牌号设置“XX1234”,速 度设置为100,载重量设置为100;另一个能为对象的所有属性赋值; (2)创建主类: 在主类中创建两个机动车对象。
package a; public class Jidongche { private String chepaihao; private int chesu; private double zaiz ...
- iOS深入学习:(UITableView系列3:insertRow)
前面一篇博客,我使用了reloadData来刷新界面,但是这样没有动画效果,那么我这里通过insertRowsAtIndexPaths:withRowAnimation设置动画效果,希望对大家有所帮助 ...
- thinkphp的自动完成功能说明
手册里有一句话很关键: 自动完成是ThinkPHP提供用来完成数据自动处理和过滤的方法,使用create方法创建数据对象的时候会自动完成数据处理. 这句话说明自动完成发生的时间是create()组建数 ...
- TCP的3次握手和4次挥手
TCP的3次握手和4次挥手 标签(空格分隔): 找工作 TCP Flags: TCP首部中有6个标志比特,主要用于操控TCP的状态机的,依次为URG, ACK, PSH, RST, SYN, FIN, ...
- LIST动态表格画线(动态列)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [C和指针]第五部分
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Python语言精要---下
函数: 可以返回多个值,其实函数是返回一个对象,就是元组,元组中的元素被拆分到各个结果变量中了 匿名函数: lambda函数,仅仅由单条语句组成,结果就是返回值 这种函数没有提供名称属性 闭包: cl ...