《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

相关文章

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

基于Python实现智能天气提醒助手

《基于Python实现智能天气提醒助手》这篇文章主要来和大家分享一个实用的Python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用,有需要的小伙伴可以参考一下... 目录项目概述核心功能技术实现1. 天气API集成2. AI建议生成3. 消息推送环境配置使用方法完整代码项目特点

Spring Security介绍及配置实现代码

《SpringSecurity介绍及配置实现代码》SpringSecurity是一个功能强大的Java安全框架,它提供了全面的安全认证(Authentication)和授权(Authorizatio... 目录简介Spring Security配置配置实现代码简介Spring Security是一个功能强

通过cmd获取网卡速率的代码

《通过cmd获取网卡速率的代码》今天从群里看到通过bat获取网卡速率两段代码,感觉还不错,学习bat的朋友可以参考一下... 1、本机有线网卡支持的最高速度:%v%@echo off & setlocal enabledelayedexpansionecho 代码开始echo 65001编码获取: >

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

IDEA实现回退提交的git代码(四种常见场景)

《IDEA实现回退提交的git代码(四种常见场景)》:本文主要介绍IDEA实现回退提交的git代码(四种常见场景),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.已提交commit,还未push到远端(Undo Commit)2.已提交commit并push到