問題和問題
我有一個小的應用程序,以異步方式從服務器獲取JSON數據,格式化爲一個表,並允許用戶執行一些簡單的操作表格(排序,篩選等)。排序行爲上傳遞函數與傳遞匿名閉包
其中一個排序函數訪問先前生成的表格(定義如下)中的DOM元素。
var SORT = function(){
var my = {};
// public methods
my.byName = function(sign){
(!sign) ? sign=1 : 1;
var T = $("#resultArea").find("tbody");
var R = T.children("tr");
R.sort(function(a,b){
var an = $(a).attr("data-name");
var bn = $(b).attr("data-name");
return sign * an.localeCompare(bn);
});
R.detach().appendTo(T);
}
...
return my; }();
當它指定爲一個元素的回調用戶可以點擊,我有兩個公式。
$("#sort-button").click(SORT.byName);
(作爲參數傳遞函數)
OR
$("sort-button").click(function(){SORT.byName();});
(通過調用該函數匿名閉包)
第一個選項失敗,但第二個作品。這裏是如何發生故障上的測試用例536行進行排序:
- 前行2(其以字母順序排之前1)被移動到位置268。
- 前行269移動到位置536
- 前行536移動到位置2.
我曾嘗試和失敗,構建以同樣的方式失敗(我一旦成功將更新的問題),一個MWE。問題是:出了什麼問題?爲什麼使用匿名封閉工作?
更新
片斷的早期版本已經被消毒,以刪除參數sign
和線在啓動(這將設置標誌爲1,如果其結果爲假或者是不確定的),這個想法是,通過傳遞sign=-1
作爲參數,可以完成降序排序。當我從實時代碼的定義中刪除sign
時,問題就消失了。
所以我發現有問題的線是(!sign) ? sign=1 : 1;
當更透明if(sign !== undefined){sign=1;}
取代時,問題就消失了。我認爲它的作用是將全局sign
設置爲第一次通過,然後在第二次通過時定義符號,以便返回1
,並且函數結束(只有一次通過已完成)。
那麼爲什麼這個錯誤不會導致匿名閉包方法崩潰?
鑑於'byName'不會在任何地方使用'this',也不會接受任何參數,所以不應該有任何可觀察到的差異。 – Bergi
'SORT'對象是在你附加點擊處理器之前創建的,之後從未改變過,對吧? – Bergi
@Bergi正確。 SORT被定義一次,有些方法會在某些用戶事件上被調用。仍然無法重現該錯誤。數字和字母排序都會出現同樣的故障模式。 – jlovegren