如何在YUI沙箱外部访问到YUI沙箱内的变量——方案一
在工作中常需要使用YUI的框架,一般我们书写代码风格大致是下面的结构:
YUI({}).use("模块名", function(Y){
//代码片段
var Index = {
page:1,
getPage : function(){
//代码片段
},
setPage : function(){
//代码片段
},
init : function(){
}
}
})
这里YUI().use(”,function(Y){…})就是一个安全沙箱,这样YUI外层想要访问到YUI内部定义的Index对象是访问不到的,但是有时候具体项目中又存在这样的需要,这时候我们除了可以定义一个全局变量就要搭建一个闭包作为YUI外部和内部的桥梁,让YUI函数外部可以访问到YUI函数内部:
1 var G = ''; //定义一个全局变量
2 YUI({}).use("", function(Y){
3 //代码片段
4 var Demo= {
5 page:1,
6 getPage : function(){
7 alert(Demo.page);
8 },
9 init : function(){
10 G = Demo;
11 }
12 }
13 Demo.init();
14 });
15 G.getPage();
但是,这个方法有时候还有一个弊端,这个弊端来由于YUI的加载时序。如果YUI的模块加载的过多时,YUI首先会加载完use的模块,再去执行function里面的代码块。这一段加载时间和另外的作用域的加载时间并不是串行的,而是并行的;从而会造成另外的代码执行时,YUI还没有加载完而造成变量没有定义,就如上面的例子:
1 var G = ''; //定义一个全局变量 2 YUI({}).use("node", "arraysort", function(Y){ 3 //代码片段 4 var Demo= { 5 page:1, 6 getPage : function(){ 7 alert(Demo.page); 8 }, 9 init : function(){ 10 G = Demo; 11 } 12 } 13 Demo.init(); 14 }); 15 G.getPage();
这时候执行这一段代码就会有报错G未定义方法getPage,如果没有加载模块则不会报错。
YUI的这个缺点在项目中曾引发过BUG,如何解决这个问题我另外写一篇博文好好分析分析~。
另外,解决YUI沙箱之间的通信不止这一种方法,这是最简单的一种方法。另外一种利用YUI框架本身的方法我打算下周学习学习以后,再写博文总结分享。