2010-10-31 65 views
1

我有這樣JavaScript如何處理函數對象?見例如

function saveProfile(data, url, successFn) { 

    $.ajax({ 

     dataType: 'json', 
     data: data, 
     url: url, 
     type: 'post', 
     success: function() { 
      successFn(); 
     } 
    }); 
} 

功能有直接傳遞successFn任何像這樣的區別...

function saveProfile(data, url, successFn) { 

    $.ajax({ 

     dataType: 'json', 
     data: data, 
     url: url, 
     type: 'post', 
     success: successFn 
    }); 
} 
+0

與函數對象無關,但我想不出一個合適的標題。 – mikerobi 2010-10-31 03:09:21

回答

2

如果只有你想要成功的事情是打電話successFn(),那麼不,你所描述的兩種方法之間沒有任何實際的區別。也就是說,我會選擇後者,因爲它更乾淨更快捷。

+0

是的,有時JavaScript是有點時髦,特別是與閉包等。只是想在我推送它之前仔細檢查。 – 2010-10-31 03:27:02

0

第一個版本將讓你執行一些額外的操作,前或者在執行successFn之後,但是由於它目前已經寫入,所以沒有任何好處,第二個版本更加清晰。

此外,這與函數對象沒有任何關係。

0

要清楚的是,在第一個例子中,你將函數successFn封裝在另一個匿名函數中,所以你實際上調用了2個函數。第二個例子,正如其他人所說的那樣,通過了函數本身,對於你正在做的事情是正確的。

3

區別在於,在第一個例子中,successFn不會獲得回調函數參數。 this對象也不會相同;實際上,如果函數不是對象的成員(在xyz.successFn(),this將是xyz),它將是window而不是任何可能爲.ajax()調用指定的context

第一種方法不夠簡潔,可能更慢;通過「包裝」功能,您很可能會使用更多的瀏覽器內存和CPU時間。我不會使用第一種方法,除非您通過代碼行支付,否則您需要this指向successFn所屬的對象。

+0

呃,你的意思是第一個例子而不是第二個? (除非問題已經被編輯,我想。) – bobince 2010-10-31 04:06:13

+0

@bobince:修正了它。 – PleaseStand 2010-10-31 13:20:54