FMS中变量的作用域-之二
在FMS中变量的作用域一文中,我曾经研究过这个问题,得到的结论是:
保存在Client中的变量对于每个客户机都是不同的,application中的变量则可以在instance中共享,instance之间不能共享变量。(使用一些变通的方法是可以的)
这里要讨论的,是FMS中到底有哪几种变量作用域(注:这里不讨论函数内部的变量),对于FMS代码中的自定义类,变量的作用域又是什么呢?在FMS的自定义类中,如何调用其他作用域的变量?
首先看一段代码:User.asc
1function User()
2{
3 varInGlobal = 0;
4 this.varInUser = 0;
5 User.varStatic = 0;
6 application.varInApp = 0;
7}
8
9User.prototype.userTrace = function()
10{
11 trace('=====================User.prototype.userTrace');
12 trace('varInGlobal:' + varInGlobal);
13 trace('this.varInUser:' + this.varInUser);
14 trace('user.varInUser:' + user.varInUser);
15 trace('User.varStatic:' + User.varStatic);
16 trace('application.varInApp:' + application.varInApp);
17}
18
19User.userTraceStatic = function()
20{
21 trace('=====================User.userTraceStatic');
22 trace('varInGlobal:' + varInGlobal);
23 trace('this.varInUser:' + this.varInUser);
24 trace('user.varInUser:' + user.varInUser);
25 trace('User.varStatic:' + User.varStatic);
26 trace('application.varInApp:' + application.varInApp);
27}
这段代码写在User.asc文件中,与main.asc处于同一个FMS程序var_test下。User是一个自定义对象,在建立User对象的时候,建立了4个变量,第1个没有用任何的修饰符,第2个用this修饰符,第3个用User修饰符,第4个application修饰符。
另外,建立了两个方法,一个是User类的静态方法userTraceStatic,另一个是实例方法userTrace,两个方法中的代码相同,都是显示这4个变量的值。其中对varInUser变量采用不同的引用方式显示了两遍。
main.asc的内容如下:
1load("User.asc");
2
3application.onAppStart = function()
4{
5 application.registerClass("User", User);
6 user = new User();
7}
8
9application.onConnect = function(client)
10{
11 trace("登录成功!");
12 application.acceptConnection(client);
13 varInGlobal ++;
14 user.varInUser += 10;
15 User.varStatic += 100;
16 application.varInApp += 1000;
17
18 globalTrace();
19 user.userTrace();
20 User.userTraceStatic();
21}
22
23function globalTrace()
24{
25 trace('=====================globalTrace');
26 trace('varInGlobal:' + varInGlobal);
27 trace('user.varInUser:' + user.varInUser);
28 trace('User.varStatic:' + User.varStatic);
29 trace('application.varInApp:' + application.varInApp);
30}
这段代码中定义了一个全局函数globalTrace,仍然是显示这4个变量的值。在onConnect事件中,改变这4个变量的值,并调用3个显示值的函数。
Flex 客户端代码:
1<?xml version="1.0" encoding="utf-8"?>
2<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
3 <mx:Script>
4 <![CDATA[
5 import flash.net.NetConnection;
6
7 private var nc:NetConnection;
8
9 private function ncClick():void
10 {
11 nc = new NetConnection();
12 nc.addEventListener(NetStatusEvent.NET_STATUS, ncHandler);
13 nc.connect('rtmp:/var_test/1');
14 }
15
16 private function ncHandler(evt:NetStatusEvent):void
17 {
18 trace(evt.info.code)
19 }
20 ]]>
21 </mx:Script>
22 <mx:Button id="ncBTN" label="nc" click="ncClick()"/>
23</mx:Application>
执行结果如下(FMS Admin Console中的显示):
登录成功!
=====================globalTrace
user.varInUser:10
varInGlobal:1
User.varStatic:100
application.varInApp:1000
=====================User.prototype.userTrace
varInGlobal:1
this.varInUser:10
user.varInUser:10
User.varStatic:100
application.varInApp:1000
=====================User.userTraceStatic
varInGlobal:1
this.varInUser:undefined
user.varInUser:10
User.varStatic:100
application.varInApp:1000
由此可见,没有使用任何标示符定义的变量varInGlobal,确实是一个全局变量,不但在自定义类中,还是在其他事件中,都是可以直接访问的。application中的变量其实和user实例中的变量是一样的,必须指定属主才能访问。而User中定义的变量和方法都是静态的,静态的方法无法使用this关键字访问实例中的变量,但可以通过全局变量user访问。
- 文章ID:524
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/fms-variable-scope/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。