2010-11-08 102 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