比尔盖子

海纳百川,有容乃大

导航

Function 委托调用与this指针的变化

Posted on 2012-03-27 00:03  比尔盖子  阅读(573)  评论(0)    收藏  举报

 在actionscript3.0语言中,当我们新建一个自定义类如下:

 1 package
2 {
3 import flash.display.Sprite;
4
5 public class Main extends Sprite
6 {
7 private var theNum:number = 8787123;
8
9 public function Main()
10 {
11 trace( this.theNum );
12 }
13 }
14 }

注意这里的this指针指向的位置是 Main 类,那么通过 this.theNum即可获得Main类中的theNum变量。

 

引发思考是 在类中使用this关键字的话,指向的位置是否都是该类呢?  

答案是NO。看下面代码


var nuiu:String = "you";
var jion:Object = new Object();
jion.nuiu = "jionsterli";
jion.showNuiu = function(nuiu:String):void{ trace(nuiu) };
jion.showNuiu("me");//调用函数会输出 -〉 me ,因为这里的nuiu引用为function(nuiu:String)中的nuiu

但是当我们将代码trace(nuiu)更改为 trace(this.nuiu) 时,如下代码

var nuiu:String = "you";
var jion:Object = new Object();
jion.nuiu = "jionsterli";
jion.showNuiu = function(nuiu:String):void{ trace(this.nuiu) };
jion.showNuiu("me");//调用函数会输出 -〉jionsterli ,而不是 you

刚开始看可能会认为会输出you,但是却输出了jionsterli,原因很简单, this指针指向出现了变化,此时的this指针指向了jion这个object,所以this.nuiu值就是jionsterli.   /完毕

------------------------------------------------------------------------------------------------------------
接下来我要写的是Function的委托机制。看代码

package
{
import flash.display.Sprite;

public class Main extends Sprite
{
public function Main()
{
this.showhello = this.hello;
this.showhello("jionterli");
}

private var showhello:Function;

private function hello( name:String ):void
{
trace( "hello", name );
}
}
}

我们可以使用flash builder 软件的单步调试功能来观察上面这段程序,很简单,

showhello 是个Function类型的变量,其没有创建内容,只是引用了hello,也就是说showhello 指向 hello,那么调用showhello 也就是调用hello了

 

我们再来看一段很简单的代码:

package
{
import flash.display.Sprite;

public class Main extends Sprite
{
private var jion:Object = new Object();

public function Main()
{
var nuiu:String = "you";

var jion:Object = new Object();
var mike:Object = new Object();

jion.nuiu = "jionsterli";
jion.showNuiu = function(pro:Number):void{ trace(this.nuiu, pro) };

mike.nuiu = "mikesterli";

jion.showNuiu(100);//输出 -〉 jionsterli,100
jion.showNuiu.call(mike, 200);//输出 -〉 mikerterli,200
jion.showNuiu.apply(mike, [300]);//输出 -〉 mikerterli,300
}
}
}

可能又有点不懂,不过原因很简单,当jion.showNuiu(Function)调用call方法的时候,如果第一参数传入其他的object,那么该函数中的this指针将切换到第一参数地址里。 

PS:很高兴你能看到结尾这里,希望我的理解能够帮助你,如果你有更多的相关知识,希望你能告诉我(关于Function委托调用)