2016-06-14 60 views
1

我被一本JS书中的例子困住了。这是一个箭头功能。工作正常,但函数引用了哪些变量?它如何知道如何处理“a,b”?箭头功能。函数指向哪些变量?

我不明白是怎么回事幕后...

const arr = [{ 
 
    name: "Suzanne" 
 
}, { 
 
    name: "Jim" 
 
}, { 
 
    name: "Trevor" 
 
}, { 
 
    name: "Amanda" 
 
}]; 
 

 
// arr sorted reverse alphabetically 
 
// by second letter of name property 
 

 
console.log(arr.sort((a, b) => a.name[1] < b.name[1]));

+4

这不是关于箭头函数。 'sort'是一个更高阶的函数,它需要一个回调函数,它被两个参数调用。 'a'和'b'可以命名为任何你想要的。 – elclanrs

+0

这本书*真的*有吗?(arr.sort((a,b)=> a.name [1]

+0

是不是?我认为省略包装'{}'的箭头函数会自动返回。编辑:它的作品(尽管我可能会排序'name [0]'而不是'name [1]' – pmilla1606

回答

4

ab的值由Array#sort功能,这是确定什么叫你的箭头功能。这与正常功能相同;例如,您的代码将相同的工作是这样的:

console.log(arr.sort(function(a, b) { 
    return a.name[1] < b.name[1]; 
}); 

里面Array#sort,你能想象一个电话给你的回调:

function Array_sort(callback) { 
    // ... 

    while (not_done_sorting_yet) { 
     // ... 
     result = callback(element[x], element[y]); // The call to your callback 
     // ...code using result... 
    } 

    // ... 
} 

正如任何回调(实际上,任何功能),代码调用它决定了它获取的参数及其值。 (忽略为简单起见部分应用程序。)


顺便说一句:该代码是错误的,从sort回调返回值被认为是一个,而不是一个布尔值:0如果ab对于分类目的是相等的,小于零是a是“小于”b为了排序目的(应该在b之前)并且大于零如果a是“大于”b为了排序目的(应该在之后)。

下面是正确的版本(数组“按名称进行排序属性的第二个字母按字母顺序颠倒” [在引用代码注释]):

// Reverse alpha by second letter in name 
console.log(arr.sort((a, b) => b.name[1].localeCompare(a.name[1]))); 

...因为String#localeCompare返回一个适当的值确定您打电话给的字符串是“小于”还是“大于”您调用的字符串。 (并且name[1]是一个单字符字符串。)