1

我之前从正在查看的 PhoneGap/cordova 文件中遇到了这个问题:

  var app = {
    initialize: function() {
        this.bind();
    },
    bind: function() {
        document.addEventListener('deviceready', this.deviceready, false);
    },
    deviceready: function() {
        // This is an event handler function, which means the scope is the event.
        // So, we must explicitly called `app.report()` instead of `this.report()`.
        app.report('deviceready');
        app.handleLogin();
    },
  }

我只是想知道这样做与在身体负载上执行的独立功能相比有什么好处?另外,如果我要在 jquery mobile 的“pagebeforeload”上运行一个函数,我将如何将其集成到上述模式中?如:

    $( '#mainMenu' ).live( 'pagebeforeshow', function(event){
    alert('pagebeforeshow');
});
4

2 回答 2

4

简而言之,命名空间。

在 JavaScript 中,一切都是全局的,除非你明确地使它不是全局的。这意味着事物的名称可能会发生冲突,或者您可以覆盖您不想要的事物。在大型程序中这是一个大问题。

您将应用程序的所有功能显示在一个app“对象”中的命名空间模式。因此,在全局范围内覆盖的任何内容bind都不会影响app.bind. 命名空间保护它。

一个好的经验法则是尽可能少地污染全局命名空间。在这种情况下,你使app全局化,就是这样。您的所有代码都与该全局值挂钩。干净整洁。


至于如何整合你的例子。我可能会做这样的事情:

  var app = {
    initialize: function() {
        app.bindEventHandlers();
        // other setup code called here...
    },
    bindEventHandlers: function() {
        $( '#mainMenu' ).live( 'pagebeforeshow', app.pageBeforeShow );
        // other event handlers bound here...
    },
    pageBeforeShow: function() {
        alert('pagebeforeshow');
    },

    // other event handler functions declared here...
    // or whatever other functions or data your app needs here...
  }

  // start your app when the document is ready
  $(document).ready(function() {
    app.initialize();
  });
于 2013-02-05T19:13:41.210 回答
1

如果您使用 OOP 语言,那么您就会知道类的定义。JS 不支持 class-keyword,因此要使用方法创建对象,应使用以下代码。然后你可以调用 app.initialize() 。它还可以为您提供应用程序架构中的高级功能。

要将您的代码集成到现有功能中,您应该原型化。

app.prototype = { nameOfFunctionHere: function() { alert('pagebeforeshow'); } }

然后打电话

app.nameOfFunctionHere();

执行你的功能

于 2013-02-05T19:16:56.560 回答