如何在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框架本身的方法我打算下周学习学习以后,再写博文总结分享。



posted @ 2012-02-19 15:21  黄短短  阅读(355)  评论(1编辑  收藏  举报