2012-04-20 21 views
0

私はしばらくの間、JSを書いてきた、と私はIE7との互換性のためのjQueryのjCarouselプラグインをデバッグしようとしています。多くの変数がOKである、難読化されていますが、私はこのような構文を見たことがない:誰もがjCarouselから次のJavaScriptコードを説明できますか?

scroll: function (a, c) { 
    !this.locked && !this.animating && (this.pauseAuto(), this.animate(this.pos(a), c)) 
} 

それは省略表記のいくつかの並べ替えのように思えるが、私はこのようなものに遭遇したことがありません。
は同様に、

for (var a = function (a) { 
    i.get(a).each(function() { 
     h(i, this, a, b, c) 
    }) 
}, k = d; k <= f; k++) { 
    k !== null && !(k >= j && k <= e) && a(k) 
} 

は私がイテレータとして割り当てられている機能を見たことがない、と再びブロック文は、内部の最初の例のように見えます。私たちはすべて我々が我々のコードを記述する際に、いくつかのバイトを保存するために努力を知っているが、私には、この熱狂的試みは他のプログラマに全く混乱と当惑のコストがかかります。誰が私に何が起こっているかの簡単な、「手書き」の代替/完全な説明を与えることができますすることができますか?私はいつもこの言語とそれがどのように動作するのか、もっと感謝したい、ありがとう。そのため、短絡評価の

答えて

2

&& operator各発現を評価することを戻る。真実がなければ、最後のものを返します。

, operatorはそれの両方のオペランドを評価し、(関係なく、彼らが返すどのような)は、第2の1を返します。最初の例ではそう

、それは基本的に言っている:

var a = function (a) { 
    i.get(a).each(function() { 
     h(i, this, a, b, c) 
    }) 
}; 

for (k = d; k <= f; k++) { 
    if (k !== null && !(k >= j && k <= e)) { 
     a(k) 
    } 
} 

について:第二の例については

scroll: function (a, c) { 
    if (!this.locked && !this.animating) { 
     this.pauseAuto(); 
     this.animate(this.pos(a), c) 
    } 
} 

、それは反復がないak変数の上にあることに注意することが重要です2つ目の例では、は、1つのvar文でpossible to define multiple variablesを忘れないでください。,

var a = 1, 
    b = 2, 
    c = 3; 

それは開発者自身は、このようなコードを最小限にされていないことを知っておくことが重要です。彼は意味のある変数名を持つブロックnormal source codeを読みやすいブロックで書いています。リリースの時間になると、ミニコード化されたバージョンをミニコード(UglifyJSClosure Compilerなど)で実行して、短縮コードを取得します。

+0

var aに割り当てられた関数の引数は、以前に宣言されたvar aのインスタンスであることを確認してください。 – danronmoon

+0

@moonDogDog:いいえ、その関数の中で 'a'は渡されたパラメータになります(この場合' a(k) 'は' for'ループの中で実行されるので、関数 'a'は' k ')。 – Matt

0

a && b && (c, d, e); 

は、基本的に等価である:

if (a) { 
    if (b) { 
     c; 
     d; 
     e; 
    } 
} 

および発現の値は、Eあろう。

2番目の例では、関数は反復子ではなく、匿名関数を初期化するためにforループの最初の位置を使用していて、それをに割り当てます。です。

そのコードの著者はちょうど過度に簡潔されます。あなたができるからといって、あなたがするべきではありません。

更新:ここ

は、機能的に等価でなければならない第二の例の再書き込みである:それは、truthyものを見つけるまで

function a (a) { 
    i.get(a).each(function() { 
     h(i, this, a, b, c) 
    }); 
} 

for (k = d; k <= f; k++) { 
    if ((k !== null) && (!(k >= j && k <= e))) { 
     a(k); 
    } 
} 
+0

(this.pauseAuto()、this.animate(this.pos(a)、c)) なぜかっこがラップされ、これらの関数をどのようにカンマ区切りにすることができますか? – danronmoon

+0

括弧はグループ化されており、関数呼び出しではありません。コンマは、各要素を評価し、最後の要素の値を返すことを意味します。 – kanaka

+0

同じコード行で、それぞれのグループの収益の価値を把握する方法はありますか? – danronmoon

関連する問題