aardio入门到精通05-名字空间

collin_pxy / 2024-10-15 / 原文

名字空间

import console; 
/*
名字空间组织、归类、标识一组具名对象的名字,是模块化编程的重要基础。 
1. var定义的局部变量有保护变量的作用,其它文件不能调用
2. 成员变量是名字空间里的变量,加前缀名字空间名来访问,在全局名字空间里可以不加前缀名字空间名
3. 不同的名字空间,相同的成员变量名不会相互影响
4. 名字空间的定义:
	namespace namespaceName{
  	//名字空间内部代码
	}
5. 名字空间可以嵌套:
	namespace namespaceName1{
    	namespace namespaceName2{
        	//名字空间内部代码
        	var member = 111
    	}
	}
	
	namespaceName1.namespaceName2.member = 123
	
6. 名字空间可以省略语句块标记{},表示名字空间作用域直至该代码文件结束:
    namespace namespaceName	
    
7. 如果在名字空间前面加上两个连续的小圆点 .. 作为前缀,则该名字空间为全局名字,如下:
	import console; 
	namespace namespaceName{
    	namespace ..globalNamespaceName{
	
        	//名字空间内部代码
        	member = 123
    	}
	}
	console.log( globalNamespaceName.member );
	console.pause(true);
	
8. 名字空间其实也是一个普通的 table 对象。
9. 访问顶层名字空间要使用 .. 操作符。
10. global 与 self 名字空间
self 表示当前名字空间。
global 为默认的全局名字空间,当aardio代码文件加载时,默认都运行在global名字空间。 
默认的名字空间为 global,也就是说 self 默认指向 global。	

*/


// 一、通过名字空间引用名字空间内的成员变量a
// 1) 在本空间内定义一个 b   在用户库的名字空间 myFirstLib 内定义一个 局部变量 a 和一个成员变量b
console.log("3------------------------------------------")
import myFirstLib;

a = 3
var b = 5
console.log(b,myFirstLib.a)  // 5   null
console.log(b,myFirstLib.b)  // 5   20


// 2) 名字空间的局部变量和成员变量
console.log("4------------------------------------------")
// 名字空间内部:
namespace test{
	// 局部变量 
	var m = 10  // 不能通过 myFirstLib.b 的方式使用,否则得到 null,局部变量只能在此名字空间内起作用,
	
	// 成员变量
	n = 20      // 这个可以被此名字空间之外的地方通过 myFirstLib.b 的方式使用
}
// 名字空间外部:
console.log(m,n)             // null   null
console.log(test.m)          // null 
console.log(test.n)          // 20


// 3) global 与 self
// 全局的名字空间 global (通常缺省) 
// 凡是不在别的名字空间内的变量都在全局的名字变量内
console.log("5------------------------------------------")
x = "你好"
var y = "aardio"
console.log(global.x)          // 你好  等同于 console.log(c)
console.log(y)                 // aardio 
console.log(global.y)          // 空值 null 不显示
console.log(global.y == null)  // true

// self 指向 本名字空间,在 global 名字空间内指向 global 在自定义的名字空间则指向自定义的名字空间
e = 3
var f = 6
console.log(self.e)          // 3 
console.log(global.e)        // 3
console.log(self.f)          // null
console.log(global.f)        // null

console.log("6------------------------------------------")
var str1 = "abcdef"
str2 = "我是外层名字空间的变量"
_str3 = "我是常量"
namespace test2{
	// 局部变量 
	var m = 10  // 不能通过 myFirstLib.b 的方式使用,否则得到 null,局部变量只能在此名字空间内起作用,
	
	// 成员变量
	n = 20      // 这个可以被此名字空间之外的地方通过 myFirstLib.b 的方式使用
	
	// 1)self 在名字空间中的使用 
	..console.log(self.m)  // null 
	..console.log(self.n)  // 20
	
	// 在一个名字空间内使用标准库或用户库,需要先导入进来,或者其外层名字空间内已经导入了,可以使用 ..库名 的方式引用
	import console
	console.log(self.n)    // 20
	
	// 2).. 的使用  ..相当于 global 而不一定是上一层
	console.log(..str1)    // null 
	console.log(..str2)    // 我是外层名字空间的变量   相当于 console.log(global.str2)
	console.log(global.str2)
	console.log(.._str3)   // 我是常量    相当于 console.log(global._str3)
	
	namespace test3{
		import console
		console.log(..test2.n)  //20
		console.log(..str2)     //我是外层名字空间的变量   相当于 console.log(global.str2)	
	}
	
	
}


// 二、关于名字空间是表的理解:
// console.dump(test2)  // 可以看出是表,并且包含很多信息
console.log("7------------------------------------------")
global["str4"] = "我是一个字符串"
console.log(global["str4"])

my_str = "hello" 
console.log(global["my" + "_str"])  // hello

b1 = "hello"
console.log(global["b" + 1])        // hello

// 上述方法的用处:
/*
import win.ui 
for(i=1;3;1){
	win.msgbox(winform["button" + i].text)
}
*/


console.pause();