1

ちょっと大きいので、この質問を何と呼ぶべきかわかりません。

基本テンプレートである Phonegap からコードをダウンロードしました。

コード例があります:

var app = {
    // Application Constructor
    initialize: function() {
        this.bindEvents();
    },
    // Bind Event Listeners
    //
    // Bind any events that are required on startup. Common events are:
    // 'load', 'deviceready', 'offline', and 'online'.
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    // deviceready Event Handler
    //
    // The scope of 'this' is the event. In order to call the 'receivedEvent'
    // function, we must explicity call 'app.receivedEvent(...);'
    onDeviceReady: function() {
        app.receivedEvent('deviceready');
    },
    // Update DOM on a Received Event
    receivedEvent: function(id) {
        var parentElement = document.getElementById(id);
        var listeningElement = parentElement.querySelector('.listening');
        var receivedElement = parentElement.querySelector('.received');

        listeningElement.setAttribute('style', 'display:none;');
        receivedElement.setAttribute('style', 'display:block;');

        console.log('Received Event: ' + id);
    }
};

「app.receivedEvent('deviceready');」の理由 「this.receivedEvent('deviceready');」ではありません。

私は理解しようとしましたが、私はそれを得ることができません。

これを私に説明できる人はいますか?

ありがとう :)

4

2 に答える 2

2

コメントはその理由を説明しています。

デバイスの準備が整ったことをアプリに通知する必要があります。コンテキスト内のthisオブジェクトはイベントそのものです。

を呼び出すようなものevent.receivedEventです。

デバイスの準備ができていることをアプリケーションに通知する必要があるため、app呼び出しが必要です。

編集:さらに明確にするために、関数を除くアプリオブジェクトthisのコンテキストです。関数は次のコードを実行します。apponDeviceReadybindEvents

document.addEventListener('deviceready', this.onDeviceReady, false);

のコンテキストをからに変更onDeviceReadyするイベントにバインドします。addEventListenerthisappevent

つまり、コンテキストが変更されappたキーワードからメソッドを呼び出すことはできません。thisこれがもう少し明確になることを願っています。

編集 2: デモンストレーションについては、このコードを参照してください: http://jsbin.com/UGerika/1/edit?html,js,output

    // http://jsbin.com/UGerika/1/edit?html,js,output
    // Demonstrates the scope of 'this' variable once a
    // function is bound to event receiver.

    var app = {
      var1: function(){
       return "i am this"; 
      },

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

        bindEvents: function() {
          alert('bindevents');   
          this.onWindowClick();
        },

      onWindowClick: function() {
        // in this case, this.var1 is perfection valid
        // 'this' is still scoped to 'app' object.
        alert(this.var1);   
      }

    };


    var app2 = {
      var1: function(){
       return "i am this"; 
      },

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

        bindEvents: function() {
          alert('bindevents');   
          document.addEventListener('mousedown', this.onWindowClick, false);
        },

      onWindowClick: function() {
        // in this case, this.var1 is invalid
        // 'this' is scoped to 'mousedown' event.
        // we would have to call app2.var1
        alert(this.var1);   
      }

    };
于 2013-09-30T16:50:38.087 に答える
0

私は phonegap アプリに慣れていません。しかし、コメントから、関数 onDeviceReady のコンテキストは実際のイベントであり、アプリ自体ではないことを理解しています。したがって、実際のアプリを参照するには、これの代わりに app を明示的に使用する必要があります。

于 2013-09-30T16:50:34.260 に答える