本文共 1365 字,大约阅读时间需要 4 分钟。
今天看到function的call和apply这两个方法,上网查了一下,有人说这两个方法是用来动态改变函数指向,并给了一个例子:如下
import customize.my_class;
public var _property:String;public function init():void{ var fn:Function = new Function(); fn = function(...args):void { this._property = args; } var __obj:my_class = new my_class(); //fn.call(__obj, "给属性赋值"); fn.apply(__obj, new Array("给属性赋值")); trace(__obj._property);}
=====================================
定义的my_class类public class my_class{public var _property:String; public function my_class() { this._property = "somiok"; }
}
从上面代码可见fn函数是用函数表达式形式申明的,此时是可以动态改变函数指向的(也就是函数的this关键字随着函数的附着而改变)。
而我用函数语句形式试了一下,函数并不能动态改变自己的指向,只能起到执行函数的作用。
import customize.my_class;
public var _property:String;
public function init():void
{ var __obj:my_class = new my_class(); //fn.call(__obj, "给属性赋值"); fn.apply(__obj, new Array("给属性赋值"));trace(__obj._property);
}private function fn(...args):void
{ this._property = args.toString();定义的my_class类
public class my_class{ public var _property:String; public function my_class() { this._property = "somiok"; }}后来查了黑羽老大的书:函数语句定义法和函数表达式定义法的不同还体现在this关键字的记忆上。使用函数语句定义法,则this关键字牢牢指向当前函数定义的域;若使用函数表达式定义法,则随着函数附着的对象不同,this关键字也随之改变。
语句定义法需先声明后调用的原则。
总结:如果函数是函数语句定义的形式:则call方法和apply方法只起到执行函数的作用。如果函数是函数表达式定义形式:则call方法和apply方法起到动态改变函数指向,同时改变被指向类的一些属性。
本文转自jiahuafu博客园博客,原文链接如需转载请自行联系原作者jiahuafu