2012-05-27 40 views
0

我正在Modernizr運行觸摸事件測試,測試似乎運行良好,但仍然是一個函數,我只打電話,如果測試成功,它的調用。功能仍然適用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()); 

有人可以告訴我爲什麼功能是sti會運行嗎?因爲我也進入控制檯,觸摸事件的消息不受支持。

回答

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)在此調用中,每當函數體參考this時,將使用對象obj。有了這個用法,函數必須是對象的已定義方法。可以使用callapply函數方法明確指定該上下文參數:當func不是obj的方法時,func.call (obj, 123)等同於上述內容。

更多細節可以在這裏找到https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function

+0

即使參數是一個函數? – Roland

+2

@Roland是的,因爲你需要將_reference_傳遞給函數,而不是函數的_result_。 – Alnitak

+0

我看到了,我剛剛測試過,看起來好像如果我已啓用觸摸事件,函數將不會運行:)也許是因爲參數是引用而不是函數? – Roland

相關問題