2010-08-20 62 views
7

Trong đoạn mã sau có "hàm (i)", nhưng "i" chưa được khai báo ở bất kỳ nơi nào trước câu lệnh này."i" trong "hàm (i)" trong mã JavaScript sau là gì?

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

Dường như nó có thể tương tự như câu lệnh "+" này. Điều đó có đúng không?

+1

Đó là hàm ẩn danh làm đối số. Vì vậy, tôi là đối số đầu tiên mà hàm chấp nhận. Phương thức retarder gọi hàm nói, gọi lại (10, 11, 12), và do đó cung cấp một giá trị cho i. Trong trường hợp này i = 10 và mọi thứ khác bị loại bỏ. – srcspider

+0

Nhân tiện, 'i' là một tên khủng khiếp cho đối số đó, thay đổi nó thành một cái gì đó mô tả –

Trả lời

4

i chỉ là tham số chức năng được chuyển bởi hàm retarder cho hàm ẩn danh.

gì nó làm là:

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

và gọi lại được định nghĩa qua chức năng ẩn danh:

function(i) { ... } 

Vì vậy mà i là định nghĩa của các tham số của hàm nặc danh.

0

Biến i đại diện cho đối tượng thực tế (như từ khóa this)


Giải thích hơn:

1) Là một tham số để một chức năng ẩn danh, như chúng ta có thể thấy:

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

2) Là tham chiếu đến đối tượng hiện tại (this).

Khi plugin jquery này kết thúc, nó gọi hàm callback, sử dụng:

(callbackFunction)(this) 

đâu đây là tham số.

+0

Như mọi người khác đã đề cập, nó là một tham số cho một hàm ẩn danh. –

+0

Buddy, yes, là một tham số cho một hàm ẩn danh ... nhưng, trong trường hợp này, là một tham số đại diện cho đối tượng thực tế = this. – Topera

+0

uh, quan tâm để giải thích? – muhmuhten

1

Biến i trong hàm khai báo chức năng ẩn danh (i) là tên được sử dụng cho tham số đầu tiên bên trong thân hàm. Nó không tương ứng với bất kỳ biến nào khác trong trang của bạn.

11

Nó trông giống như một khai báo hàm:

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

Vì vậy i là một giá trị được truyền vào chức năng (mà đã được công bố nội tuyến như một chức năng ẩn danh) như tham số đầu tiên của nó, có lẽ bởi liên kết nội hoạt động của phương pháp retarder mà bạn đang chuyển hàm vào.

Re-viết code để nó là một chút dễ đọc hơn làm cho điều này rõ ràng hơn một chút:

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

Và sau đó bạn có thể viết lại nó được thậm chí rõ ràng hơn:

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. một 'đối số' – aviraldg

+0

@Aviral, yeup, chính xác, ... =) – Rob

7

Đó là một tham số hàm.

+0

lý do tại sao mức giảm? Câu trả lời chắc chắn là chính xác, ngay cả khi nó không chi tiết. Giải thích cho mình. –

+0

+1 để sửa lỗi downvote ngu ngốc. – slebetman

+0

+1 upvoted vì lợi ích của việc thiếu nhận xét từ downvoter :-) –

5

nó tạo ra một hàm ẩn danh lấy một đối số duy nhất, sau đó được gọi là i trong hàm.

+1

Nếu bạn muốn nhận được kỹ thuật, chức năng * chính thức * có một tham số duy nhất. Conceivably bạn có thể vượt qua nhiều ** đối số ** và truy cập chúng thông qua một đối tượng cùng tên. – ChaosPandion

2

Lý do bạn có thể không hiểu điều này là nếu bạn không quen với việc sử dụng các chức năng ẩn danh trong JavaScript. Bạn có thể quen nhiều hơn với cái gì đó như:

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

i là một tham số cho hàm double. Trong JavaScript, chức năng tương tự có thể được thực hiện như:

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

Trong trường hợp này, chức năng ẩn danh được tạo và gán cho biến double. i vẫn chỉ là một tham số. Cả hai có thể được gọi là double(3).

Trong ví dụ bạn đã cung cấp, thay vì gán hàm ẩn danh cho một biến, nó được chuyển làm đối số cho hàm khác.

1

Nếu bạn đang cố gắng để giải mã các mã rối loạn mà tôi nghĩ rằng bạn đang có, sau đó bạn có thể tìm cho định nghĩa hàm này ...

$.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; }; 

tôi phải đào sâu hơn một chút để tìm thấy nó bởi vì nó được tạo động trong một eval().

Vì vậy, để trả lời câu hỏi của bạn, tham số "i" là đối tượng "ul" (trong mã bạn đã đăng).

Nếu bạn nhìn vào chức năng retarder, nó trả về "this", giống như hầu hết các plugin jquery khác, do đó, nó duy trì khả năng của các plugin.

không phải là điều thú vị?

Các vấn đề liên quan