来自John Resig的JavaScript学习高级JavaScript#45

时间:2011-03-25 01:35:55

标签: javascript

function highest(){ 
          return makeArray(arguments).sort(function(a,b){ 
            return b - a; 
          }); 
        } 

function makeArray(array){ 
  return Array().slice.call( array ); 
} 

assert(highest(1, 1, 2, 3)[0] == 3, "Get the highest value."); 
assert(highest(3, 1, 2, 3, 4, 5)[1] == 4, "Verify the results.");

这个例子来自John Resig的Learning Advanced JavaScript#45。 http://ejohn.org/apps/learn/#45

以下是一些我很感激帮助的问题。提前谢谢。

1)。当function highest()返回makeArray(arguments)时,function makeArray会在sort的{​​{1}}函数之前发生吗?这样在makeArray()运行之后,剩下的部分

function highest
函数最高的

继续,并且从makeArray返回的数组进行排序?

2)在函数makeArray(数组)中,究竟什么是“call”调用?

3)在函数makeArray中,是否使用了切片,因为调用分别采用其参数而不是数组?

4)在最后的断言中,[1]是否代表4> 1的数组中的位置。即排序后有一个数组['5','4','3','3','2','1']

2 个答案:

答案 0 :(得分:3)

  1. 是的,这是完全正确的。这些行动按顺序发生。

  2. 它正在调用Array.prototype.slice并传递array arguments highest对象slice。在没有参数的情况下调用时,arguments只返回它正在处理的对象的副本。这就是我们将类似数组的slice对象转换为实际数组的方法。

  3. 见#2。 callarguments串联使用可生成highest的实际数组副本。

  4. 是的,再次,你是对的。 {{1}}函数返回一个数组,其中包含按降序排序的参数。

答案 1 :(得分:2)

在我回答这个问题时,又发布了另一个答案。但我认为问题中显示的大多数混淆都归结为一个关键点。

在JavaScript中,函数和方法是对象。哪些可能有属性等。当您说Array.slice时,您会获得slice方法。当您说Array.slice()时,您现在正在调用 slice方法。因此Array.slice.call访问call对象上slice方法的Array属性。 (该属性本身就是一种方法。)Array.slice.call( stuff )调用

这是一个很容易错过的语言的基本事实。但如果你不明白这一点,你会发现使用它的代码几乎不可能真正理解。