作用:

替换当前对象的方法中的this。

理解:

call和apply是为了动态改变this出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作。

用的比较多的,通过document.getElementsByTagName选择的dom 节点是一种类似array的array。

它不能应用Array下的push,pop等方法。我们可以通过:

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

这样domNodes就可以应用Array下的所有方法了。

语法:

call([thisObj[,arg1[, arg2[,   [,.argN]]]]])  ##没提供thisObj , Global 对象将被用作 thisObj。参数用逗号分隔。

apply([thisObj [,argArray]])  ##没提供 thisObj , Global 对象将被用作 thisObj。参数为一个数组,与call的主要区别就在参数形式上,这样如果参数个数确定可以用call,如果参数个数不确定就用apply。

技巧:

1.把arguments转为数组

function args2arr() {
return [ ].slice.call(arguments, 0);
//return Array.prototype.slice.call(arguments, 0); //和上边的写法效果相同
}
args2arr(1, 2, 3, 5, 6, 7, 8); //[1, 2, 3, 5, 6, 7, 8]
arguments对象:该对象代表正在执行的函数和调用它的函数的参数。不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。函数的 arguments 对象并不是一个数组,访问单个参数的方式与访问数组元素的方式相同。
slice: 返回一个数组的一段。arrayObj.slice(start, [end]) [start是开始的下标,end是结束的下标,end不是长度]
所以[ ].slice.call(arguments, 0)是调用了数组的slice方法,但是对象被替换成了arguments,并且传入start参数0,就是把全部参数slice成一个新数组。

2.返回数组中的最大值

function argsMax() {
// 找出对象 arguments 当中数字最大的值
return Math.max.apply(null,arguments);
} argsMax(1, 2, 3, 5, 6, 7, 8) //

Math.max([number1[, number2[. . . [,numberN]]]]) : 返回给出的零个或多个数值表达式中较大者。

max本身接收用逗号分隔的参数,通过apply方法传入数组形式的参数,第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去。

3.合并两个数组

var arr1=new Array("1","2","3");
var arr2=new Array("4","5","6");
Array.prototype.push.apply(arr1,arr2);

arrayObj.push([item1 [item2[. . . [itemN ]]]]) : 将新元素添加到一个数组中,并返回数组的新长度值。

这里arr1作为劫持Array的push方法的对象,把arr2当做参数传入。


例子:

1.借用函数

function getName() {
return this.name
}
var obj = {name: "jack"};
getName.call(obj) //jack,js 中的函数其实是对象,函数名是对 Function 对象的引用。

2.借用对象方法

var obj1 = {
name: "panxuepeng",
getName: function() {return this.name}
}
var obj2 = {name: "jack"};
obj1.getName.call(obj2) //jack

3.稍复杂的对象

 //构造函数,对应的对象就是Animal.
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
} function Cat(){
this.name = "Cat";
} var animal = new Animal();
var cat = new Cat(); animal.showName.call(cat); //Cat,调用对象中的方法必须先实例化类
/*
*调用Animal对象的方法showName必须先实例化Animal类,如果只是调用属性
*可以直接Animal.property就行
*所以上边的写成Animal.showName.call会报错
*/
//animal.showName.apply(cat,[]);

4.继承

    function Animal(name){
this.name = name;
this.showName = function(){
alert(this.name);
}
} function Cat(name){
Animal.call(this, name);
} var cat = new Cat("Black Cat");
cat.showName(); //Black Cat

JS中call和apply的更多相关文章

  1. js中call和apply的实现原理

    js中call和apply的实现原理            实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...

  2. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  3. 区别和详解:js中call()和apply()的用法

    1.关于call()和apply()的疑点: apply和call的区别在哪里 什么情况下用apply,什么情况下用call apply的其他巧妙用法(一般在什么情况下可以使用apply) 2.语法和 ...

  4. JS中call、apply的用法说明

    JS Call()与Apply()的区别 ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是 ...

  5. js中call、apply、bind那些事

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  6. js中call、apply和bind的区别

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢.在说区别之前还是先总结一下三者的相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对 ...

  7. js中的call,apply,bind区别

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

  8. JS中call和apply区别有哪些 记录

    一.call和apply区别 传递参数的方式.用法上不同,主要是参数不完全同 (1).B.Function.call(A,arg,arg) 这个例子是讲A对象“调用”B对象的Function(某个具体 ...

  9. JS 中 call 和 apply 的理解和使用

    本文受到了知乎问题 如何理解和熟练运用js中的call及apply? 的启发. obj.call(thisObj, arg1, arg2, ...); obj.apply(thisObj, [arg1 ...

随机推荐

  1. bootstrap fileinput-上传回调

    通过第三分jquery重新绑定一个重新加载事件 $("#file-4").on("fileuploaded", function(event, data, pr ...

  2. javascript原型Prototype【转】

    转自:http://www.cnblogs.com/starof/p/4190404.html 在javaScript创建对象一文中提到过:用构造函数创建对象存在一个问题即同一构造函数的不同实例的相同 ...

  3. perl 哈希 连接符

    #!/usr/bin/perl -w use strict; my $test_1 = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; my $test_2 ...

  4. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  5. Linux下的文本编辑工具

    vi/vim nano(据说Ubuntu下推荐用这个,有点反人类,不太习惯) emacs

  6. NuGet命令行工具和可视化工具

    Nuget出了命令行工具之外,还有一个可视化工具,下载地址如下: 命令行(推荐官网下载,有中文提示!):https://dist.nuget.org/index.html 可视化(简单.方便.易用): ...

  7. 使用Github Pages创建自己的网站

    这是一篇使用Github Pages创建自己网站的教程,操作很简单,相信,亲们肯定一学就会,但是大家也要有一定的github基础呀,所以小编给大家附上一个链接(http://www.cnblogs.c ...

  8. fileinput

    # -*- coding: utf-8 -*- __author__ = 'metasequoia' import fileinput def file_input(): for line in fi ...

  9. AngularJs ngList、ngRepeat、ngModelOptions

    ngList 在文本输入的分隔的字符串和字符串数组间做转换,可以是一个固定的字符串分隔符(默认逗号)或正则表达式. 格式:ng-list=”value” value:表达式  通过这个值分隔字符串. ...

  10. UVa 437 The Tower of Babylon(经典动态规划)

    传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details ...