FMS中变量的作用域

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:FMS中变量的作用域
  • 本文链接:http://zengrong.net/post/221.htm


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

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

var aa = 1;
var bb = 2;
var cc = 3;
application.onConnect = function(newClient){
this.acceptConnection(newClient);
}
Client.prototype.test = function(a, b, c){
trace("更改之前aa:"+aa);
trace("更改之前bb:"+bb);
trace("更改之前cc:"+cc);
aa = a;
bb = b;
cc = c;
trace("更改之后aa:"+aa);
trace("更改之后bb:"+bb);
trace("更改之后cc:"+cc);
}

对应的客户端代码:

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

执行的结果如下:

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

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

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

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

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

application.onAppStart = function(){
this.aaa = 1;
this.bbb = 2;
this.ccc = 3;
}
application.onConnect = function(newClient){
this.acceptConnection(newClient);
}
Client.prototype.test = function(a, b, c){
trace("更改之前application.aaa:"+application.aaa);
trace("更改之前application.bbb:"+application.bbb);
trace("更改之前application.ccc:"+application.ccc);
application.aaa = a;
application.bbb = b;
application.ccc = c;
trace("更改之后application.aaa:"+application.aaa);
trace("更改之后application.bbb:"+application.bbb);
trace("更改之后application.ccc:"+application.ccc);
}

执行的结果如下:

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

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

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

8月16日,小结

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