2012-01-03 22 views
12

Tôi hơi bối rối về cách hoạt động của hàm trong javascript. Tôi hiểu rằng họ là tất cả các đối tượng nhưng làm thế nào mà thay đổi cách tôi sẽ sử dụng chúng làm đối số?Khi nào cần khai báo hàm mới (ẩn danh) trong javascript?

Ví dụ, nếu tôi đang cố gắng sử dụng một hàm callback nơi đối số thứ 2 được đánh giá sau 1000ms ...

$(this).fadeIn(1000,function(){alert('done fading in');}); 

Tại sao tôi không thể đạt được tác dụng tương tự với:

$(this).fadeIn(1000,alert('done fading in')); 

Nếu có, nó sẽ đánh giá cả hai cùng một lúc. Đó là, (điều này) yếu tố mất dần và cảnh báo bật lên cùng một lúc.

Khi tôi gọi cảnh báo (arg), tôi có đang tạo đối tượng mới được chuyển vào fadeIn() không?

Chính xác điều này hoạt động như thế nào?

+0

câu hỏi hay. Tôi sẽ dán xung quanh cho điều này – OptimusCrime

+0

Đối với các nerds ngôn ngữ: Kỹ thuật bạn muốn được gọi là * [partial function application] [1] *, cũng thường được gọi là * Currying *. Bạn có hiệu quả muốn có một chức năng mới, nơi một số đối số được cố định, và những người khác thì không. [1]: http://en.wikipedia.org/wiki/Partial_application –

+1

@nd: Không, đó không phải là thực sự. Không có sự đánh giá một phần nào của currying hoặc đang diễn ra trong ví dụ này. Nếu bạn đang tìm kiếm một thuật ngữ, * chức năng ẩn danh * là nó. Ngoài ra * các hàm bậc cao hơn * cho các hàm có chức năng làm đối số. – KaptajnKold

Trả lời

19

Trong này

$(this).fadeIn(1000,alert('done fading in')); 

gì fadeIn() xem như là đối số thứ hai của nó? Đó là kết quả của việc gọi

alert('done fading in') 

chúng ta đang thực hiện cuộc gọi cảnh báo() trước gọi fadeIn().

Trong trường hợp này

$(this).fadeIn(1000,function(){alert('done fading in');}); 

chúng tôi có một đối tượng

function(){alert('done fading in');} 

mà fadeIn() gọi vào đúng thời điểm.

2

Trong dòng đầu tiên tham số thứ hai là phương thức. Và trong dòng thứ hai của nó một cuộc gọi phương thức.

bạn cũng có thể viết nó như thế này

function fadeInCallback() { 
    alert('done fading in'); 
} 

$(this).fadeIn(1000, fadeInCallback); 

Vì vậy, những gì chúng tôi làm là chúng ta vượt qua trong một tham chiếu đến fadeInCallback nên chức năng jQuery fadeIn có thể gọi fadeInCallback khi nó đã được thực hiện với fading.

Dòng thứ hai sẽ thực hiện

alert('done fading in'); 

trước executeing jQuery fadeIn chức năng

5

Khi bạn viết:

$(this).fadeIn(1000,alert('done fading in')); 

bạn gọi hàm gọi là cảnh báo immadiately bằng cách đặt tên hàm và dấu ngoặc đơn sau tên này. Và để fadeTrong kết quả của cuộc gọi này được thông qua - điều này là không xác định, bởi vì trả về cảnh báo luôn luôn không xác định.

Khi bạn viết

$(this).fadeIn(1000,function(){alert('done fading in');}); 

bạn tạo một đối tượng hàm đó và vượt qua đối tượng chức năng này để fadeIn.Vì vậy, sau khi fadeIn được thực hiện nó có thể gọi chức năng này.

Nó cũng giống như:

// create function 
var callback = function() { alert('done fading in'); }; 
// and pass this function to fadeIn 
$(this).fadeIn(1000, callback); 

nhưng khi bạn viết:

var callback = alert('done fading in'); 
$(this).fadeIn(1000, callback); 

sau đó bạn sẽ gọi cảnh báo immadiately và vượt qua giá trị fadeIn mà lợi nhuận cảnh báo - không xác định.

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