推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
whatisnew

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

  •  
  •   whatisnew · Apr 18, 2015 · 3546 views
    This topic created in 4069 days ago, the information mentioned may be changed or developed.

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

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

    因为myapp本来就是个框架。

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

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

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

    function todo() { ... }

    return {
    todo: doing
    }
    });


    ... FUN.doing();
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   979 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 22:24 · PVG 06:24 · LAX 15:24 · JFK 18:24
    ♥ Do have faith in what you're doing.