2013-04-23 39 views
2

第一個參數我有下面的代碼片段:的jQuery強調作爲功能

MARKUP:

<tr name="tr3" id="tr3"> 
    <td> 
     <input type="text" class="common_cls" name="dt[]" id="dt1"> 
    </td> 
    <td> 
     <input type="hidden" name="fn[]" id="fn1"> 
     <span id="sp1"><a href="#" id="ah1">choose file</a><span> 
     <input type="file" name="fff[]" id="ff"> 
     <input type="text" style="display:none"> 
    </td> 
</tr>'; 

JAVASCRIPT

$(document).on('click', '#add_row', function() { 
    var row = $("table#DocTable tr:eq(3)"); 
    row.clone(true) 
     .show() 
     .find("a, input, span").each(function() { 
      $(this) 
       .val('') 
       .attr('id', function(_, id) { 
        var newcnt = id + count; 
        return id + count; 
       }); 
     }) 
     .end() 
     .appendTo("table"); 
    count++; 

我以前寫這一年多,我不得不援助有問題的位。

作爲在.attr方法中調用的函數的第一個參數,下劃線的用途是什麼?

這個函數到底有多精確?是否只是將所有a,spaninput標籤中的當前id替換爲增加的數字?

回答

4

在這種情況下,當前元素的索引存儲在_中。該函數的所有功能是使用該元素的id + count更新每個元素的屬性。如果您改爲將它命名爲indexi您可能已經猜到它包含索引了。

5

下劃線通常用作未命名變量的佔位符。基本上,如果您不打算使用該變量,則不需要爲其找到名稱,因此您可以使用下劃線。

不要與i18n下劃線功能或underscore.js混淆。

P.S.:我不確定這種做法是從哪裏來的,但是當我第一次看到一個下劃線被用於某些事情時,這是我在學習Prolog時(其中_其實代表「任何值」)。

+0

爲什麼這個未使用的變量是必需的?爲什麼不直接寫'function(id){// blah blah blah}'? – gibberish 2013-04-23 21:01:02

+0

@gibberish,因爲第一個參數包含索引,並且您希望該值不是索引。 – 2013-04-23 21:02:32

+1

@gibberish,無論你想要什麼,你都可以調用你的函數參數,而JS解釋器不能通過'id'猜測你實際上是指第二個參數而不是第一個參數。不幸的是,JS中不支持「關鍵字參數」。 – ubik 2013-04-23 21:06:01

0

那麼,這隻能由作者回答。 _有函數的第一個參數的名稱。

基於我可以看到的代碼我猜測,由於_變量沒有在函數中使用,所以第一個參數在此函數中不是必需的,所以它被「stubbed」與一個_而不是一個隨機的名字。

3

這個答案有很多方面與評論和其他答案有關。所以,我會盡力下面鞏固他們:

首先,在提到一段代碼,下劃線參數的使用方法如下: -

$(this).val('').attr('id', function(_, id) { return id + i }); 

從jQuery的文檔爲attr功能here,存在attr的過載形式,即.attr(attributeName, function)。在這種形式的function被描述爲

類型:函數(整數索引,字符串ATTR)

因此,需要兩個參數。但是,在我們的代碼中,我們只需要id,這恰好是第二個參數。現在

,因爲JS處理函數參數的方式,我們不能把它寫成function(id),因爲JS會映射到idindex(預期function第一個參數)。因此,我們寫的函數需要有兩個參數。

在這裏,一個標準的約定發揮作用。如上所述here

下劃線字符(_)用作表示未使用的函數參數的標準方式。

但是,這只是一個約定而不是一個規則。我們可以將未使用的參數命名爲indexunused。也就是,

$(this).val('').attr('id', function(unused, id) { return id + i }); 

將是一個有效的等效。

因此,替換未使用參數的_這種用法可用於任何其他具有類似重寫窗體的jQuery函數。例如,在this的答案中,我們可以在$.text()的調用中看到下劃線的用法。爲了確認,$.text()有一個被覆蓋的形式,它接受一個帶有兩個參數的函數,如here所示。