我也提出问题

保留原著,并且问题被回答或审核通过时通知你:


ActionScript中Function的call()方法和apply()方法

        今天看到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();
}

        后来查了黑羽老大的书:函数语句定义法和函数表达式定义法的不同还体现在this关键字的记忆上。使用函数语句定义法,则this关键字牢牢指向当前函数定义的域;若使用函数表达式定义法,则随着函数附着的对象不同,this关键字也随之改变。语句定义法需先声明后调用的原则。

总结:如果函数是函数语句定义的形式:则call方法和apply方法只起到执行函数的作用。
如果函数是函数表达式定义形式:则call方法和apply方法起到动态改变函数指向,同时改变被指向类的一些属性。

- 作者:古风依云 | http://hi.baidu.com/crkay

收藏 & 推荐 & 分享

Post a Comment

Your email is never shared. Required fields are marked *

*
*

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word