2010-11-08 5 views
0

Quel est le meilleurbind combiné avec un retard

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

ou

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

Je sais que les deux façons vont envelopper les choses en deux couches, mais supposons que l'un des arguments permet de dire arg1 est un objet est une référence du contexte actuel, par exemple var arg1 = this.some_obj. Maintenant, à cause de toutes les affaires avec passer par la valeur, passer par référence, et la portée de la fonction sera la deuxième manière ne pas être en mesure de récupérer arg1 parce que lorsque delay est appelé son contexte est l'objet global.

Répondre

2

Il est assez facile à tester et les deux fonctionnent bien.

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 

La date de naissance est un objet et est donc transmise par référence. Vous pouvez voir cela se produire parce que l'année est définie après l'appel et l'écriture différée montre une date dans le passé.

Maintenant, changez la ligne importante en foo.bind(this).delay(4, this.dob) et cela fonctionne toujours!

Voici la question vraiment difficile. Pourquoi foo.delay.call(this, 4, this.dob) ne fonctionne pas?

+0

Est-ce une question difficile pour l'OP? –

+0

C'est vraiment pour tout le monde. Je pose la question à ceux qui ont du temps et qui sont curieux. – clockworkgeek

+0

Ok, juste une supposition (n'a pas le temps de le tester maintenant): après le délai, 'this' ne fait plus référence à' object' mais à quelque chose d'autre (probablement 'window'). Correct? BTW, je pense que votre appel de fonction est faux: selon [Function # delay'] (http://api.prototypejs.org/language/function/prototype/delay/) le premier paramètre ('timeout') doit être spécifié. –