一个热心网友说的简单明了:
"apply是针对不定个数参数函数 call是针对固定参数个数的函数,效果等同,是用于影响函数中的this引用指向的。"
在有些时间的特殊设计中,需要动态更改函数中的默认指向当前对象内部域 指向到其它对象中时,就可以用它了,但一般极少用!!!
一般就单纯用() 来直接调用函数就可以了。
import flash.display.MovieClip; var mc1:MovieClip = new MovieClip() var mc2:MovieClip = new MovieClip() mc1.name = "mc1" mc2.name = "mc2" mc1.i = 123; mc1.samcall = function(){ trace("当前对象域是:" + this.name + " ,i的值是" + this.i) } mc1.samcall() mc2.i = 6765; mc1.samcall.call(mc2) //这里改变了this的引用到mc2中,所以引用this.i时 变为 mc2的 6765 ==================== 输出是这样的 当前对象域是:mc1 ,i的值是123 当前对象域是:mc2 ,i的值是6765
而下面菩提树下的杨过,说的很详细,我记录在下面。
以下摘录自:作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
------------------------------------------------
Function类的重要方法call()与apply()
我们知道,每个function最终在执行时,都要有一个上下文环境,也就是this指针在函数执行时,到底指向谁的问题?
var jimmy: Object = new Object (); |
//定义jimmy对象的一个方法 |
jimmy.addSalary = function (addSalary: uint ): void { |
trace ( "姓名:" , this .name, ",原工资:" , this .salary, ",新工资:" , this .salary + addSalary); |
}; |
这里我们动态的给jimmy对象定义了一个addSalary方法,注意addSalary方法体中的this,如果我们用
jimmy.name = "jimmy.yang" ; |
jimmy.salary = 3000 ; |
jimmy.addSalary( 500 ); //姓名: jimmy.yang ,原工资: 3000 ,新工资: 3500 |
这样调用时,this指针默认就是指向jimmy的,所以this.name自然就是jimmy.yang,而this.salary自然也就是3000,这不废话么?
但是我们可以借助Function类的apply以及call方法,显式改变this指针的指向!注意上面代码中的这一部分:
var mike: Object = new Object (); |
mike.name = "Mike" ; |
mike.salary = 5000 ; |
jimmy.addSalary.call(jimmy, 1000 ); //姓名: jimmy.yang ,原工资: 3000 ,新工资: 4000 |
jimmy.addSalary.call(mike, 1000 ); //姓名: Mike ,原工资: 5000 ,新工资: 6000 |
这里我们又搞出了一个mike对象,而且并没有给他定义addSalary方法,但如果系统也要给mike同志临时加工资怎么办? 可以把jimmy对象的addSalary方法应用在mike身上,即jimmy.addSalary.call(mike,1000),最终mike得偿所愿,在原工资5000的基础上加了1000,就成了工资6000 (如果现实中加工资也这么容易就好了)
至于apply方法,作用跟call一样,也可以用来改变函数执行时,this指针的指向,区别在于apply方法要求第二个参数必须是数组形式,即:
jimmy.addSalary.apply(mike,[1100]);