@NemoAlex @Phariel 不要试图污染 window 除非你是一个框架级的东西

2015-04-18 18:57:16 +08:00
 whatisnew

以下代码示例,如果不用 window 如何,在别的 .js 文件里引用呢?

// app.js
// ------

(function() {

  require(['router'], function(router) {

    var app = {

      initialize: function() {
        this.bindEvents();
      },

      bindEvents: function() {
        window.onload = this.onDeviceReady();
      },

      onDeviceReady: function() {
        main.receivedEvent('deviceready');
      },

      receivedEvent: function(event) {
        switch (event) {
          case 'deviceready':
            app.initMian();
            break;
        }
      },

      initMian: function() {

        // 不用 window 如何把这货在别的 .js 里可用?
        window.db = openDatabase('db', '1.0', 'description', 10240);

        window.$ = jQuery;

      }

    };

    app.initialize();

  });

})();
2973 次点击
所在节点    JavaScript
14 条回复
whatisnew
2015-04-18 19:03:16 +08:00
在另外一个文件,比如,router.js
我就可以用 $('.element').on('event', function...
我就可以用 db.transaction(function(tx) { ...
yangff
2015-04-18 20:24:08 +08:00
export?
haozhang
2015-04-18 20:35:41 +08:00
用命名空间啊,你暴露一个变量在全局环境里面,所有东西挂在那个变量上面。
jarlyyn
2015-04-18 20:37:35 +08:00
把你所有的js放在一个闭包/空间里呢?
我觉得直接用window.db不如直接用windows.myapp.db.
whatisnew
2015-04-18 20:55:35 +08:00
@haozhang 那这样的话,除了名字不叫 window 有什么区别么。。。
@jarlyyn 那还不是 window...
wxt2005
2015-04-18 20:59:00 +08:00
@whatisnew 暴露一个和暴露多个的区别吧。你现在是刚好只需要注册一个变量,所以感觉没啥区别,如果以后代码加了新的功能怎么办?
lk09364
2015-04-18 21:05:25 +08:00
@whatisnew
> 那这样的话,除了名字不叫 window 有什么区别么。。
对,没有,不过这样就不会和别的库冲突了。

node.js 里的 export 容许你 require() 出来,并自定义变数名称,这样就绝对不会冲突——
whatisnew
2015-04-18 21:08:49 +08:00
@lk09364 对,这个在 requirejs 里边也可以 export,但是不是用于干这个的。。。
whatisnew
2015-04-18 21:10:47 +08:00
@wxt2005 就是只有在 app.js 这个文件里才用 window,其他都是 require 出来的 mvc 文件,但是在 model 和 controller 这层要用到 db 这些变量,因为不可能每 new 一次都 open 一下 db 啊
haozhang
2015-04-18 21:22:43 +08:00
去看看YUI...了解下明明空间。
haozhang
2015-04-18 21:22:56 +08:00
命名空间 ...
jarlyyn
2015-04-18 21:30:03 +08:00
@whatisnew

因为myapp本来就是个框架。

如果你用其他框架,比如jQuery,那么就应该放在jquery里。
NemoAlex
2015-04-19 13:09:56 +08:00
你 @ 了我,所以我进来看了一下
但是看完,我都不知道说什么好了
所以就这样吧
ghbjy1128
2015-04-25 08:34:24 +08:00
楼主的问题其实就是Js设计模式的问题,现在有很多流派,自己随便选个自己喜欢的就可以。
个人偏好还是定义一个命名空间,如果有什么需要外部调用的,return 就可以,大概这样子。

window.FUN = (window.FUN || {});

// Main Functions
FUN = (function ($) {
'use strict';

function todo() { ... }

return {
todo: doing
}
});


... FUN.doing();

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/184598

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX