2011-10-18 19 views
2

私はjqueryのシズルライブラリ枠組みの中でぶらぶらして、私はいくつかの疑問が頭に来コードJavascript配列関数?

[0, 0].sort(function() { 
    baseHasDuplicate = false; 
    return 0; 
}); 

のこの作品を見た:

  1. が何であるかを
  2. この関数を呼び出す方法この種の機能を書くメリット
  3. なぜそれは独特の文章スタイルですか?
  4. は、 "関数"の "ソート"と "="である必要はありませんか?

この回答以外にも、この記事に関する記事やチュートリアルは素晴らしいでしょう。

+0

あなたはsort()かanonymous関数を意味しますか? – usoban

+0

@usoban私は知っている。 –

+0

いいえ、 '関数'によって、あなたはどちらを意味していますか?ソート関数、または引数? – usoban

答えて

5

最初はほとんどのコードを理解しましたが、すべてではありません。配列の簡略表記と無名関数はわかりましたが、sortFunctionには2つの引数が必要です。このため、私はをなぜ理解していませんでしたかあなたはこれをやるでしょう:達成したいコード。

幸いにも、Googleの検索で解決しました。あなたはjsPerfサイト上のコードを見つけ、このリンクでコンテキストに示した質問から元の関数を表示することができます。

http://jsperf.com/jquery-1-4-3-perf-degrade/4

今、私たちはまた、コードのコメントを見ることができます:

// Here we check if the JavaScript engine is using some sort of 
// optimization where it does not always call our comparision 
// function. If that is the case, discard the hasDuplicate value. 
// Thus far that includes Google Chrome. 
[0, 0].sort(function() { 
    baseHasDuplicate = false; 
    return 0; 
}); 

ソート関数の仕組みに慣れていれば、今は完璧です。シーケンスをソートするとき、ソートアルゴリズムは、シーケンスから2つのアイテムを頻繁に比較し、どちらを先にソートするかを知る必要があります。このような関数は、ソートをカスタマイズできるようにするために、別の関数を引数として渡すことができることが多く、この関数がどのように項目を比較するかを決定する作業です。

この場合、既にソートされた小さな配列があります。合理的な並べ替えアルゴリズムは、この関数を正確に1回呼び出してから終了する必要があります。しかし、javascriptコンパイラは、特定の状況でcompare関数を最適化しようとし、呼び出されないことがあります。したがって、このコードの目的は、いつ起こっているのかを検出することです。関数を呼び出す前に、まずbaseHasDuplicateの値をtrueに設定します。次に、このコードを実行し、baseHasDuplicateが変更されたかどうかを確認します。

+0

+1コードのコンテキストを把握するために余分な努力をしています。 –

1

Array.sort引数としての機能を持ちます。この関数は配列要素を比較し、実際の結果を返すために適切な結果を返す責任があります。したがって、渡された関数を直接ソートする必要はありません。

0

あなたは、パラメータを受け入れるArray.sort()関数を呼び出します。これは、2つの要素を比較する関数です。ドキュメントから読めるように、関数はfalseまたはtrueを返す必要があります。

ここで引数は、無名関数であり、クロージャです。参照を保持しないので、直接呼び出すことはできません。

あなたはパラメータとして関数を渡しているので、ソート関数はどこかでannon関数を使用することになるので、[0, 0].sort = function(){}ではありません。それを(=を使用して)割り当てる場合は、sort関数自体を変更します。

+2

ソート関数はfalseまたはtrueを返すべきではありません。以下の3つの状態があります。より小さい、より大きい、等しい。第3の状態を無視すると問題が発生する可能性があります。 –

関連する問題