《AS3 Expert》_2:FB与FD代码智能提示的隐匿陷阱

2024-01-05 19:18

本文主要是介绍《AS3 Expert》_2:FB与FD代码智能提示的隐匿陷阱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

一、问题

代码 1:
  1. public function Main():void
  2. {
  3. var obj1:Object = new Object();
  4. obj1.greet = function():void
  5. {
  6. trace("hi, " + this.author);
  7. };
  8. obj1.greet();
  9. }

  10. private var author : String = "sban ";
复制代码
你觉得代码1的输出结果是“hi, sban”吗?

代码 2:
  1. public function Main():void
  2. {
  3. var arr1 :Array = ["as3", "expert", "programming"];
  4. arr1.some(
  5. function(item :String, index :int=-1, arr :Array=null) : Boolean
  6. {
  7. if (item == "as3")
  8. {
  9. trace(item, this.author);
  10. return true;
  11. }

  12. return false;
  13. }
  14. );
  15. }

  16. private var author : String = "sban";
复制代码
对于代码2,你觉得它的输出结果是“as3 sban”吗?

答案均是否。无论在代码1中,还是在代码2中,变量author均是不可访问的。然而编译器并不会报错。
代码2, 作者是在fd3.0.6版本中编写的,当写到变量author,它给了我一条代码智能提示:



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



对于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);

这篇关于《AS3 Expert》_2:FB与FD代码智能提示的隐匿陷阱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/573891

相关文章

SpringCloud集成AlloyDB的示例代码

《SpringCloud集成AlloyDB的示例代码》AlloyDB是GoogleCloud提供的一种高度可扩展、强性能的关系型数据库服务,它兼容PostgreSQL,并提供了更快的查询性能... 目录1.AlloyDBjavascript是什么?AlloyDB 的工作原理2.搭建测试环境3.代码工程1.

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Java中ArrayList的8种浅拷贝方式示例代码

《Java中ArrayList的8种浅拷贝方式示例代码》:本文主要介绍Java中ArrayList的8种浅拷贝方式的相关资料,讲解了Java中ArrayList的浅拷贝概念,并详细分享了八种实现浅... 目录引言什么是浅拷贝?ArrayList 浅拷贝的重要性方法一:使用构造函数方法二:使用 addAll(

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

SpringBoot使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

轻松掌握python的dataclass让你的代码更简洁优雅

《轻松掌握python的dataclass让你的代码更简洁优雅》本文总结了几个我在使用Python的dataclass时常用的技巧,dataclass装饰器可以帮助我们简化数据类的定义过程,包括设置默... 目录1. 传统的类定义方式2. dataclass装饰器定义类2.1. 默认值2.2. 隐藏敏感信息

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

Ubuntu 24.04 LTS怎么关闭 Ubuntu Pro 更新提示弹窗?

《Ubuntu24.04LTS怎么关闭UbuntuPro更新提示弹窗?》Ubuntu每次开机都会弹窗提示安全更新,设置里最多只能取消自动下载,自动更新,但无法做到直接让自动更新的弹窗不出现,... 如果你正在使用 Ubuntu 24.04 LTS,可能会注意到——在使用「软件更新器」或运行 APT 命令时,

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类