2010-08-20 102 views
7

在下面的代碼中有「函數(i)」,但是「i」在此語句之前的任何地方都沒有聲明。在下面的JavaScript中,「function(i)」中的「i」是什麼?

ul.css({width: 10, overflow: 'visible'}).retarder(100, function(i){ 
    i.css('visibility', 'visible').animate(
     {width: ul[0].wid,left:-50}, 
     {duration: 500, complete : function(){ 
     ul.css('overflow', 'visible'); 
     }} 
    ); 
}); 

看起來它可能類似於C++「this」語句。這是否正確?

+1

這是一個匿名函數作爲參數。因此,我是該函數接受的第一個參數。 retarder方法調用函數say,callback(10,11,12),從而爲i提供一個值。在這種情況下,我= 10,其他一切都被丟棄。 – srcspider 2010-08-20 20:01:04

+0

順便說一句,'i'對於這個論點來說是一個可怕的名字,把它改爲描述性的東西 – 2011-03-03 09:16:10

回答

4

i只是一個函數參數,它被retarder函數傳遞給匿名函數。

它是什麼:

ul.css({width: 10, overflow: 'visible'}).retarder(100, callback_function); 

和回調是通過匿名函數定義:

function(i) { ... } 

這樣i是匿名函數的參數的定義。

0

變量i表示實際的對象(如關鍵字this


解釋更多:

1)是到一個匿名函數的參數,我們可以看到:

.retarder(100, function(i){...}) 

2)是對當前對象的引用(this)。

當這個jQuery插件完成後,它調用回調函數,使用:

(callbackFunction)(this) 

如果是這種參數。

+0

正如其他人所提到的那樣,它是一個匿名函數的參數。 – 2010-08-20 19:58:07

+0

好友,是的,是一個匿名函數的參數......但在這種情況下,它是一個表示實際對象= this的參數。 – Topera 2010-08-20 20:00:42

+0

恩,小心解釋一下? – muhmuhten 2010-08-20 20:03:26

1

匿名函數聲明函數(i)中的變量i是用於函數體內第一個參數的名稱。它不對應於您網頁中其他任何變量。

11

它看起來像一個函數聲明:

function(i) 
{ 
    // ..... 
} 

所以i是被傳遞到該函數的值由內(其被聲明爲inline作爲匿名功能)作爲它的第一個參數,據推測您正在傳遞函數的retarder方法的工作方式。

重新編寫代碼,以便它是一個更具可讀性使這是一個有點清晰:

ul.css(
    { 
    width: 10, 
    overflow: 'visible' 
    } 
).retarder(100, function(i) 
    { 
    i.css('visibility', 'visible').animate(
     { 
     width: ul[0].wid, 
     left:-50 
     }, 
     { 
     duration: 500, 
     complete: function() 
      { 
      ul.css('overflow', 'visible'); 
      } 
     } 
    ); 
    } 
); 

然後你就可以把它改寫成甚至清晰的:

ul.css(
    { 
    width: 10, 
    overflow: 'visible' 
    } 
).retarder(100, functionToPassToRedtarder); 

function functionToPassToRetarder(i) 
{ 
    i.css('visibility', 'visible').animate(
    { 
     width: ul[0].wid, 
     left:-50 
    }, 
    { 
     duration: 500, 
     complete: functionToPassToComplete 
    } 
); 
} 

function functionToPassToComplete() 
{ 
    ul.css('overflow', 'visible'); 
} 
+6

aka。一個'參數' – aviraldg 2010-08-20 19:35:17

+0

@Aviral,yeup,正好,... =) – Rob 2010-08-20 19:39:54

7

這是一個函數參數。

+0

爲什麼downvote?答案當然是正確的,即使它不詳細。自己解釋一下。 – 2010-08-20 19:45:21

+0

+1以糾正愚蠢的downvote。 – slebetman 2010-08-20 19:46:51

+0

+1 upvoted爲了缺少來自downvoter的評論:-) – 2010-08-20 19:48:20

5

它創建一個匿名函數,它接受一個參數,然後在函數中將其引用爲i

+1

如果你想獲得技術,函數*正式*採用單個參數。可以想象,你可以傳遞許多**參數**並通過同名的對象訪問它們。 – ChaosPandion 2010-08-20 19:46:44

2

您可能無法理解的原因是,如果您不熟悉JavaScript中匿名函數的使用。你可能更熟悉的東西,如:

function double(i){ 
    return i + i; 
} 

i是功能double的參數。在JavaScript中,同樣的功能可以像做:

var double = function(i){ 
    return i + i; 
}; 

在這種情況下,一個匿名函數被創建,然後分配給一個變量doublei仍然只是一個參數。兩者都可以稱爲double(3)

在您提供的示例中,不是將匿名函數分配給變量,而是將其作爲參數傳遞給另一個函數。

1

如果你試圖解碼混淆代碼,我認爲你是,那麼你可能在找這個函數定義...

$.fn.retarder = function(delay, method){ 
var node = this; 
if (node.length){ 
    if (node[0]._timer_) 
     clearTimeout(node[0]._timer_); 
    node[0]._timer_ = setTimeout(function(){ method(node); }, delay); 
} 
return this; }; 

我不得不挖得更深一些找到它,因爲它是在eval()中動態生成的。

所以要回答你的問題,「i」參數是「ul」對象(在你發佈的代碼中)。

如果你看看retarder函數,它會返回「this」,就像大多數其他的jquery插件一樣,所以它保持了插件的鏈式能力。

是不是去混淆樂趣?

相關問題