2010-11-08 106 views
0

哪個組合更好綁定延遲

some_func.bind(this,arg1,arg2,arg3).delay(4); 

some_func.bind(this).delay(4,arg1,arg2,arg3); 

我知道,這兩種方式都會換東西了兩層,但假設的論據之一可以說arg1是一個對象,是當前背景下的參考,例如var arg1 = this.some_obj。現在因爲所有的業務都通過值傳遞,所以通過引用和功能範圍將第二種方式無法恢復arg1,因爲當調用delay時,它的上下文是全局對象。

回答

2

這很容易測試,兩種方式都很好。

function object() { 
    this.foo = function(arg) { 
     document.write(this.bar+' was born on '+arg); 
    } 
    this.bar = 'Bob'; 
    this.dob = new Date(); 
    foo.bind(this, this.dob).delay(4); 
    this.dob.setFullYear(1971); 
} 
object(); // start the delay 

出生日期是一個對象,因此通過引用傳遞。您可以看到發生這種情況的原因,因爲年份是在通話後設置的,而延遲寫入顯示的是過去的日期。

現在將重要行改爲foo.bind(this).delay(4, this.dob),它仍然有效!

這是一個非常難的問題。爲什麼foo.delay.call(this, 4, this.dob)無效?

+0

這是OP的難題嗎? – 2010-11-08 11:49:34

+0

這是真的。對於那些有時間並且很好奇的人來說,這是我感興趣的問題。 – clockworkgeek 2010-11-08 14:26:47

+0

好吧,只是一個猜測(現在沒有時間來測試它):在延遲之後,'this'不再指'object',而是指其他的東西(可能是'window')。正確?順便說一句,我認爲你的函數調用是錯誤的:根據['Function#delay'](http://api.prototypejs.org/language/function/prototype/delay/),第一個參數('timeout')必須是指定。 – 2010-11-08 23:11:48