您的位置:首页 > 移动开发

js的call和apply的应用说明

2015-11-25 11:06 218 查看
call方法:

语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])

定义:调用一个对象的一个方法,以另一个对象替换当前对象。

说明:

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

<script type="text/javascript">
var testobj={name:'bing'};
function A(){
alert(this);
alert('hello');
alert(this.name);
}
A();//执行A函数
function B(){
A.call(testobj);
}
B();//执行B函数
</script>
执行A()函数时,依次弹出object Window,hello,空。其中this就是代表当前的window对象

执行B函数时,其实就是调用A函数,因为有call(testobj)的存在,就将A函数里的this,用testobj来替换了,所以依次输出object testobj,hello,bing.

可以看做成是B函数继承A函数,并且改变执行的this对象

同时,call(obj,[arge,arge,...])可以存入列表参数

<script type="text/javascript">
var testobj={name:'bing'};
function A(){
console.log(this);
console.log(this.name);
console.log(arguments[0]);
}
A();
function B(){
A.call(testobj,'1','2');
}
B();
</script>
B函数,调用A函数的同时,既改变A函数this的执行对象,同时有传入参数列表1,2。这两个参数。而在A函数里,通过arguments数组可以获取到这两个值,所以在A中,是可以通过arguments来调用参数完成我们的任务。更加深入了解可以了解一下arguments对像。

apply方法:

语法:apply([thisObj[,argArray]])

定义:应用某一对象的一个方法,用另一个对象替换当前对象。

说明:

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

和call其实没有本质区别,区别在于apply()只接受两个参数,第一个是对象,第二个是一个数组参数。而call()的可以有很多参数列表。

function changeStyle(attr, value){
this.style[attr] = value;
}
var box = document.getElementById('box');
window.changeStyle.apply(box, ['height',200]);


call中的第一个参数用于指定将要调用此函数的对象,在这里,changeStyle函数将被box对象调用,this指向了box对象,如果不用call的话,程序报错,因为window对象中没有style属性。

以下是其他的一些经典用法

apply的一些其他巧妙用法

细心的人可能已经察觉到,在我调用apply方法的时候,第一个参数是对象(this), 第二个参数是一个数组集合,

在调用Person的时候,他需要的不是一个数组,但是为什么他给我一个数组我仍然可以将数组解析为一个一个的参数,

这个就是apply的一个巧妙的用处,可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 这个如果让我们用程序来实现将数组的每一个项,来装换为参数的列表,可能都得费一会功夫,借助apply的这点特性,所以就有了以下高效率的方法:

a)Math.max 可以实现得到数组中最大的一项

因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组

但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项

(apply会将一个数组装换为一个参数接一个参数的传递给方法)

这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去

b)Math.min 可以实现得到数组中最小的一项

同样和 max是一个思想 var min=Math.min.apply(null,array);

c)Array.prototype.push 可以实现两个数组合并

同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply来装换一下这个数组,即:

vararr1=new Array("1","2","3");

vararr2=new Array("4","5","6");

Array.prototype.push.apply(arr1,arr2);

也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合.

通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法:

一般在目标函数只需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地解决这个问题!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: