0

Modernizr でタッチ イベント テストを実行しています。テストは正常に実行されているようですが、テストが成功した場合にのみ呼び出している関数が呼び出されます。

これはテストです:

Cluster.prototype.test_touch_event_support = function(callback) {
    return (Modernizr.touch) ? callback : log("Touch Support Undetected");
};

そして、これはテストが成功した場合にのみ実行される関数です:

Cluster.prototype.initiate_shop_touch_events = function() {
    var self = this;
    return $("#" + this.shop_wrapper_id).hammer({prevent_default: true, drag_min_distance: Math.round(this.viewport_width * 0.1)}).bind("drag", function(ev) {
        var data = JSON.parse(self.get_local_storage_data(self.shop_data_key));
        var step = (ev.direction == "left") ? 1 : -1;
        var new_page = parseInt(data.current_page + step);
        return (new_page > 0 && new_page <= data.total_pages) ? $(self.shop_navigation_class).jPages(new_page) : false;
});
};

そして、テストに渡す引数に依存していなくても、そのようにチェックしています:

self.test_touch_event_support(self.initiate_shop_touch_events());

関数がまだ実行されている理由を誰かに教えてもらえますか? コンソールにも、タッチイベントがサポートされていないというメッセージが表示されるためです。

4

1 に答える 1

2
self.test_touch_event_support(self.initiate_shop_touch_events());

self.initiate_shop_touch_eventsを呼び出した結果をself.test_touch_event_supportに渡します

あなたがする必要があります:

self.test_touch_event_support(self.initiate_shop_touch_events);

関数を渡すため。

Cluster.prototype.test_touch_event_support = function(callback) {
    return (Modernizr.touch) ? callback : log("Touch Support Undetected");
};

コールバックを参照せずに呼び出す必要があります。

Cluster.prototype.test_touch_event_support = function(callback) {
    return (Modernizr.touch) ? callback.call (this) : log("Touch Support Undetected");
};

学ぶべき教訓:

  1. 関数を呼び出すこととそれを参照することの違いを理解してください。多くのプログラミング言語とは異なり、JavaScriptの関数はファーストクラスのエンティティです。それらの名前を呼び出すことにより、それらへの参照を渡すことができます。関数を呼び出したり、呼び出したり、実行したりするには、関数参照の直後に角かっこで囲まれた、場合によっては空の引数のリストを指定する必要があります。
  2. 呼び出されると、すべての関数thisに、関数本体の単語を使用して参照されるコンテキストパラメーターが渡されます。これは多くの場合、関数名の前にオブジェクト参照を付けることで指定されます。たとえばobj.func (123)、この呼び出しではobj、関数本体が参照するたびにオブジェクトが使用されますthis。この使用法では、関数はオブジェクトの定義済みメソッドである必要があります。関数のcallandapplyメソッドを使用して、このコンテキスト引数を明示的に指定できます。がのメソッドでないfunc.call (obj, 123)場合は、上記と同等です。funcobj

詳細については、https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Functionを参照してください。

于 2012-05-27T09:55:12.023 に答える