js的call和apply的应用说明
2015-11-25 11:06
218 查看
call方法:
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
执行B函数时,其实就是调用A函数,因为有call(testobj)的存在,就将A函数里的this,用testobj来替换了,所以依次输出object testobj,hello,bing.
可以看做成是B函数继承A函数,并且改变执行的this对象
同时,call(obj,[arge,arge,...])可以存入列表参数
apply方法:
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
和call其实没有本质区别,区别在于apply()只接受两个参数,第一个是对象,第二个是一个数组参数。而call()的可以有很多参数列表。
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的方式巧妙地解决这个问题!
语法: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的方式巧妙地解决这个问题!
相关文章推荐
- Android使用gradle的管理本地Maven服务器
- (转)iOS App初始化或者升级,涉及本地数据库迁移的问题
- iOS 性能优化:Instruments 工具的救命三招
- IOS_改变状态栏颜色 隐藏状态栏
- android-activity
- iOS 学习笔记
- Android,setTextColor等背景选择器设置失败问题,及多种设置方法
- Android 使用 ViewPager循环广告位的实现
- Swift类方法
- Android 将Activity打成jar包供第三方调用
- android:关于系统时间
- iOS-语言本地化
- androidstudio 中 使用git
- 个人不常用、但是热门的iOS第三方库
- xcode7集成百度地图(framwork包) archive是bitcode问题
- iOS +AFNetworking2.0调用webService
- 【转】android多分辨率适配
- Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸
- 关于EditText的一点深入的了解
- 自定义android主题样式