我不确定这是不是一个bug。以下方案在Chrome和Firefox中均失败,因此我不完全确定。如果这实际上是我的错,有人可以告诉我为什么这不起作用。
以下是该错误的简化示例:
var bObj = {
list: [4,5,23,5,90,1],
sort: function() {
var cb = function(a, b) {
return a - b;
}, that = this;
this.list.sort(function(a, b) {cb.call(that, a, b);});
}
};
bObj.sort();
console.log(bObj.list);
var wObj = {
list: [4,5,23,5,90,1],
sort: function() {
var cb = function(a, b) {
return a - b;
};
this.list.sort(cb);
}
};
wObj.sort();
console.log(wObj.list);
输出:
[4, 5, 23, 5, 90, 1]
[1, 4, 5, 5, 23, 90]
使用Function.call,我需要维护上下文,因为我在回调中引用了对象属性。我最后通过一个简单的闭包解决了这个问题。我仍然想知道为什么会失败。
由于
答案 0 :(得分:3)
您的sort
函数没有返回任何内容:
sort: function() {
var cb = function(a, b) {
return a - b;
};
var that = this;
this.list.sort(function(a, b) {
cb.call(that, a, b); // <--- here's your bug in the javascript engine.
});
}
虽然,我认为这是一种更清洁的方法:
sort: function() {
var cb = function(a, b) {
return a - b;
};
this.list.sort(cb.bind(this));
}