javascript引擎中的错误?带有Function.call的Array.prototype.sort用于回调

时间:2014-09-03 19:32:43

标签: javascript

我不确定这是不是一个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,我需要维护上下文,因为我在回调中引用了对象属性。我最后通过一个简单的闭包解决了这个问题。我仍然想知道为什么会失败。

由于

1 个答案:

答案 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)); 
  }