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

随机推荐
- Python3基础 len函数 获得一个字符串的字符个数
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- 【leetcode❤python】119. Pascal's Triangle II
#-*- coding: UTF-8 -*-#杨辉三角返回给定行#方法:自上而下考虑问题,从给定的一行计算出下一行,则给定行数之后,计算的最后一行就是求解的最后一行class Solution(obj ...
- FragMent 初级学习
FragMent 可以用在一个Activity中也可以用在多个Activity中 我们在activity中加载FragMent的时候,首先添加一个myFragMent的类 通过onCreateView ...
- [c/c++]linux下使用c/c++操作mysql
首先需要安装相应的库文件,直接apt-get就可以. sudo apt-get install libmysqlclient-dev 编译的时候,需要额外链接到这个库.如果是apt-get安装的话,那 ...
- 起点CG原创教程——digicel.FlipBook.6教程
http://blog.renren.com/blog/262793929/473221163
- iOS问题处理:如何在Mac下显示Finder中的所有文件
摘自:http://www.cnblogs.com/elfsundae/archive/2010/11/30/1892544.html 在Unix下工作,你可能需要处理一些“特殊“文件或文件夹,例如/ ...
- C# 线程(四):生产者和消费者
From : http://kb.cnblogs.com/page/42530/ 前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时 ...
- Phantomjs 在cmd命令行显示中文乱码
cmd命令行窗口显示中文乱码 cmd中文支持gbk编码 在js执行文件中加上(一般在最开始加) phantom.outputEncoding="gbk"; 这样乱码就正确了
- C#正则表达式编程(四):正则表达式
正则表达式提供了功能强大.灵活而又高效的方法来处理文本.正则表达式的全面模式匹配表示法使您可以快速分析大量文本以找到特定的字符模式:提取.编辑.替换或删除文本子字符串:或将提取的字符串添加到集合以生成 ...
- nginx安装配置域名转发
1.安装pcre 1.[root@localhost home]# tar zxvf pcre-8.10.tar.gz //解压缩 2.[root@localhost home]# cd pcre-8 ...