zoukankan      html  css  js  c++  java
  • YUI3学习笔记 ( 8 )

    Y.namespace()方法

    Y.namespace()的作用是提供命名空间,其实有原理很简单。例如Y.namespace("A.B");事实做了这样一件事:
    Y.A = {}; Y.A.B = {};

    .namespace()方法在YUI2中就已经有了,到了YUI3,其实它的作用削弱了。在YUI2中,YAHOO是一个全局作用域的对象,所以.namespace()创建的对象是全局作用域的,不在同一个函数作用域中,也可以互相访问。但到了YUI3,Y是一个函数内的作用域,不同函数之间用namespace()方法创建的对象是不能互相访问的。

    demo如下:

    ============================================
    [YUI2]

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>阿当制作</title>
    <script src="http://assets.taobaocdn.com/yui/2.7.0/build/yuiloader/yuiloader-min.js" type="text/javascript"></script>
    <script type="text/javascript">
    var loader = new YAHOO.util.YUILoader();  
    </script>
    </head>

    <body>
    <script type="text/javascript">
    function init(){
    (function(){       
    YAHOO.namespace("A.B");
    YAHOO.A.B.testStr = "hello world";
    var num = 12345;
    })();

    (function(){
    alert(YAHOO.A.B.testStr);
    alert(num);
    })();
    }
    </script>


    <script type="text/javascript">
    loader.require(['dom', 'event']);
    if(init){
    loader.onSuccess = init;
    }
    loader.insert();
    </script>
    </body>
    </html>


    =========================================

    [YUI3]

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>阿当制作</title>
    <script src="http://yui.yahooapis.com/3.0.0b1/build/yui/yui-min.js" type="text/javascript"></script>
    </head>

    <body>
    <script type="text/javascript">
    YUI().use(function(Y){
    Y.namespace("A.B");
    Y.A.B.testStr = "hello world";
    });

    YUI().use(function(Y){
    alert(Y.A.B.testStr);
    });
    </script>
    </body>
    </html>

    =============================================

    如果想在YUI3中也使用能跨函数的对象,我们只能在YUI().use()方法外定义一个全局变量,然后将它赋值给Y.namespace()生成的对象,用全局变量搭一个桥梁。但这种方法也有问题,因为YUI.use()方法是动态加载js文件的,其回调函数的触发时间是没有保障的,有可能第二个YUI().use()的回调在第一个YUI().use()的回调之前触发。下面是个demo:

    =======================================

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>阿当制作</title>
    <script src="http://yui.yahooapis.com/3.0.0b1/build/yui/yui-min.js" type="text/javascript"></script>
    </head>

    <body>
    <script type="text/javascript">
    YUI().use("dd","console",function(Y){
    alert(1);
    });

    YUI().use(function(Y){
    alert(2);
    });
    </script>
    </body>
    </html>

    ================================================

    从流程上来看,应该是先弹出1,后弹出2,但事实上,因为use()方法是异步加载的,别起了别的线程,所以两个回调的触发时间并不由use()方法使用的前后来决定,因为后面那个use方法没有加载其它组件,所以它的回调反而在前面那个之前触发。



  • 相关阅读:
    excel多个工作表数据快速合并到一个工作表方法
    客商申请单客商编码自动编码
    如何实现Excel多人共享与协作
    商家推销技巧-将广告做成实用信息
    如何实现扫码填报信息
    DBSync如何连接并同步MySQL
    如何在微信中发布动态信息
    一款数据库比较与同步软件的设计与实现
    【原创】在 ASP.NET Core 3.1 中使用 Senparc.Weixin.Work 企业微信 SDK —— 发送文本消息
    【原创】在 .NET Core 3.1 中使用 Senparc.Weixin.Work 企业微信 SDK —— 发送文本消息
  • 原文地址:https://www.cnblogs.com/cly84920/p/4426949.html
Copyright © 2011-2022 走看看