2012-04-20 56 views
0

我一直在寫JS,我一直在試圖調試IE7兼容性的jQuery jCarousel插件。很多變量會被混淆,這是確定的,但我從來沒有見過的語法是這樣的:任何人都可以從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評估每個表達式,直到它找到一個其是truthy,它回報。如果沒有一個是真的,它會返回最後一個。

, operator評估它的操作數並返回第二個(不管它們返回什麼)。

在第一個例子

因此,它基本上說:

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) 
    } 
} 

至於第二個例子中,要注意的迭代是在k變量,而不是a很重要第二個例子,不要忘記它是possible to define multiple variables在一個var聲明中使用,

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

知道,開發者自己沒有減少這樣的代碼是很重要的;他正在寫易於閱讀塊的有意義變量名稱的normal source code。說到發佈時間,他會通過縮小版(UglifyJS,Closure Compiler等)運行縮小版以獲得縮減的代碼。

+0

可以肯定的是,賦值給var a的函數中的參數是var a的一個先前聲明的實例,對嗎? – danronmoon 2012-04-20 16:11:15

+0

@moonDogDog:不,在函數中'a'將是傳遞的參數(在這種情況下'a(k)'在'for'循環中運行,所以在函數'a'內部將是'k ')。 – Matt 2012-04-20 16:13:54

0

由於短路評價的:

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

基本上等同於:

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

而表達式的值將是ë

在第二個示例中,函數不是迭代器,他只是使用for循環的第一個位置初始化一個匿名函數,然後將其分配給a

該代碼的作者只是過於簡潔。只因爲你可以,並不意味着你應該。

更新

下面是第二實施例的再寫入的內容應該是功能上等同的:

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 2012-04-20 16:05:41

+0

該parens是分組,而不是一個函數調用。逗號表示評估每個元素,然後返回最終元素值。 – kanaka 2012-04-20 16:07:52

+0

有沒有辦法在同一行代碼中捕獲每個分組的返回值? – danronmoon 2012-04-20 16:13:39

相關問題