[转]FB与FD同时存在的一个bug(代码智能提示的隐匿陷阱)

[url]http://sban.biz/82[/url]


FB4与FD3均存在一个代码智能提示的bug,一不小心你就会写出错误的代码,并且编译器不会给你任何错误信息。
一、问题

代码 1:
public function Main():void
{
var obj1:Object = new Object();
obj1.greet = function():void
{
trace("hi, " + this.author);
};
obj1.greet();
}

private var author : String = "sban ";
你觉得代码1的输出结果是“hi, sban”吗?
代码 2:
public function Main():void
{
var arr1 :Array = ["as3", "expert", "programming"];
arr1.some(
function(item :String, index :int=-1, arr :Array=null) : Boolean
{
if (item == "as3")
{
trace(item, this.author);
return true;
}

return false;
}
);
}

private var author : String = "sban";
对于代码2,你觉得它的输出结果是“as3 sban”吗?
答案均是否。无论在代码1中,还是在代码2中,变量author均是不可访问的。然而编译器并不会报错。
代码2,作者是在fd3.0.6版本中编写的,当写到变量author,它给了我一条代码智能提示:

[img]http://dl.iteye.com/upload/attachment/388579/c9e4203b-c503-3200-a07f-68a1a167d074.png[/img]

如果说FD作为一款社区开源免费产品,出现这种bug是情有可原的话,那么Adobe动辄几百美元一个licence的FB4也存在同样的bug,就今人咋舌了。
代码2,在FB4中也存在同样的智能提示:

[img]http://dl.iteye.com/upload/attachment/388581/036a2b2a-bd5d-3b92-a824-e65b79b58364.png[/img]


对于As3初学者,不明白this关键字的真正涵义,在编辑器的错误误导下,并且编译器也没有任何的错误提示,很容易写出错误的代码。
在livedoc中,Adobe对于this的说明很明确,以下语句摘自livedoc:
A reference to a method’s containing object. When a script executes, the this keyword references the object that contains the script. Inside a method body, the this keyword references the class instance that contains the called method.
this关键字真正涵义等同于“owner”,意指包含当前函数体的对象。在代码1中,this指obj1。在代码2中,this指一个全局的对象(并非包涵变量author的对象),所以this.author均是不可见的,编辑器向我们给出了错误的智能提示。
二、解决方案

那么,在代码1或2中,如果确实我们需要访问变量author,应该怎么做呢?答案很简单,把this关键字去掉就可以了。在AS3中,如果没有指定对象或关键字this,avm2优先在当前作用域内查找变量,如果找不到,则向上查找。
三、总结

1,关键字this指的是包涵当前函数体的上一级对象
2,未指定对象或this的变量,avm2如果在当前作用域内找不到该变量,则尝试在上一级作用域内查找。
四、思考与练习

1,想一想下面的代码的输出结果是什么?为什么?
public function as3():void
{
var author :String = "as3 fans";
trace(author);
}
private var author : String = "sban";
2,想一想在代码2中,如果不去掉关键字this,如何使程序得到同样的输出结果?
trace(item, this.author);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值