FMS中变量的作用域

我一直认为,在FMS中,没有定义在Client对象中的变量都是全局的(不包括函数中定义的局部变量)。但是我发现我的理解大错特错了。 :(

为了测试"全局"变量的作用域,我写了下面这段代码(服务器端):

 1var aa = 1;
 2var bb = 2;
 3var cc = 3;
 4application.onConnect = function(newClient){
 5this.acceptConnection(newClient);
 6}
 7Client.prototype.test = function(a, b, c){
 8trace("更改之前aa:"+aa);
 9trace("更改之前bb:"+bb);
10trace("更改之前cc:"+cc);
11aa = a;
12bb = b;
13cc = c;
14trace("更改之后aa:"+aa);
15trace("更改之后bb:"+bb);
16trace("更改之后cc:"+cc);
17}

对应的客户端代码:

 1var nc1:NetConnection = new NetConnection();
 2var nc2:NetConnection = new NetConnection();
 3nc1.connect("rtmp:/test/1");
 4nc2.connect("rtmp:/test/2");
 5btn1.onPress = function() {
 6nc1.call("test", null, 4, 5, 6);
 7};
 8btn2.onPress = function() {
 9nc2.call("test", null, 7, 8, 9);
10};

执行的结果如下:

test/1的执行结果
test/1的执行结果

test/2的执行结果
test/2的执行结果

从上面的结果看,我以前认为的"全局"变量,仅仅只是初始值是"全局"的! :em11: 而当某个Client改变它之后,就"变成"了Client变量了。

那么,application中的变量又如何?

再看看修改过的服务器端代码(客户端代码不变):

 1application.onAppStart = function(){
 2this.aaa = 1;
 3this.bbb = 2;
 4this.ccc = 3;
 5}
 6application.onConnect = function(newClient){
 7this.acceptConnection(newClient);
 8}
 9Client.prototype.test = function(a, b, c){
10trace("更改之前application.aaa:"+application.aaa);
11trace("更改之前application.bbb:"+application.bbb);
12trace("更改之前application.ccc:"+application.ccc);
13application.aaa = a;
14application.bbb = b;
15application.ccc = c;
16trace("更改之后application.aaa:"+application.aaa);
17trace("更改之后application.bbb:"+application.bbb);
18trace("更改之后application.ccc:"+application.ccc);
19}

执行的结果如下:

test/1的执行结果
test/1的执行结果

test/2的执行结果
test/2的执行结果

看来,application中的变量是一样的"下场"。 :em10:

8月16日,小结

经过上面的测试已经弄明白,保存在Client中的变量对于每个客户机都是不同的,application中的变量则可以在instance中共享,instance之间不能共享变量。(使用一些变通的方法是可以的)