V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
whatisnew
V2EX  ›  JavaScript

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

  •  
  •   whatisnew · 2015-04-18 18:57:16 +08:00 · 2963 次点击
    这是一个创建于 3296 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    因为myapp本来就是个框架。

    如果你用其他框架,比如jQuery,那么就应该放在jquery里。
    NemoAlex
        13
    NemoAlex  
       2015-04-19 13:09:56 +08:00
    你 @ 了我,所以我进来看了一下
    但是看完,我都不知道说什么好了
    所以就这样吧
    ghbjy1128
        14
    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();
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2612 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:51 · PVG 09:51 · LAX 18:51 · JFK 21:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.