Question

Je veux passer un tableau d'objets à la fonction SetTimer en Javascript.

setTimer("foo(object_array)",1000);

am faire erreur sur ce code.

** Note: ** Désolé! une correction dans ma question: Est-il possible en fonction setInterval ()

.
Était-ce utile?

La solution

Utiliser une fonction anonyme au lieu d'une chaîne de caractères sur le premier paramètre de la setTimeout ou setInterval fonctions:

// assuming that object_array is available on this scope
setInterval(function () { foo(object_array); }, 1000);

Pourquoi ça marche:

Lorsque vous définissez une fonction interne, il peut se référer aux variables présentes dans leur fonction d'enceinte extérieure, même après leurs fonctions parents ont déjà terminé.

Cette fonction de la langue est appelée fermeture de rel="noreferrer"> .

Si vous passez une chaîne comme premier argument de ces fonctions, le code sera exécuté en interne en utilisant un appel à la eval fonction, et le faire est pas considéré comme un bonne pratique .

Eval permet d'accéder directement au compilateur JavaScript et exécute le code il est passé avec les privilèges de l'appelant, en utilisant également eval à plusieurs reprises / largement (votre fonction setInterval est un bon exemple) conduira à les problèmes de performance.

Autres conseils

Je vais développer ici la réponse de Luc parce qu'il traite d'un cas d'utilisation que CMS (et la plupart des réponses à ce genre de question) ne fonctionne pas.

Si vous devez lier vos arguments à l'appel de fonction au moment où vous définissez le délai d'attente , une enceinte simple fonction ne fonctionne pas:

echo = function (txt) { console.log(txt); };

val = "immediate A";
echo(val);

val = "delayed";
window.setTimeout(function () { echo(val); }, 1000);

val = "immediate B";
echo(val);

En supposant que vous utilisez la console Firebug, la sortie ci-dessus « immédiate A », « B immédiate » et « immédiate B » 1 seconde plus tard. Pour lier la valeur au moment de la méthode de piège de l'utilisation d'appel setTimeout Luc. Ce qui suit modifie un peu d'accepter des fonctions arbitraires et longueurs d'arguments:

echo = function (txt) { console.log(txt); };

trap = function (fn, args) {
    return function() {
        return fn.apply(this, args);
    };
};

val = "immediate A";
echo(val);

val = "delayed";
window.setTimeout( trap(echo, [val]), 1000);

val = "immediate B";
echo(val);

Je ne sais pas s'il y a un moyen de passer implicitement, le contexte de l'appelant, mais il pourrait être étendu à accepter un argument de contexte si « ce » ne vous donne pas là.

D'abord, il est 'setTimeout'

seconde, ne passez pas une chaîne. La vraie solution dépend du reste du code. Façon la plus robuste serait de piéger le champ:

var obj_array = something;
function trap(obj)
{
    function exec() { foo(obj); }
    return exec;
}
setTimeout(trap(obj_array), 1000);

piège retourne une fonction qui a votre choix pris dans son champ d'application. Cette fonction est générique, mais pour le rendre spécifique à votre problème, il peut être simplifié:

var obj_array = something;
function trap()
{
    function exec() { foo(obj_array); }
    return exec;
}
setTimeout(trap(), 1000);

ou même:

var obj_array = something;
function trap()
{
    foo(obj_array);
}
setTimeout(trap, 1000);

et enfin condensé jusqu'à:

var obj_array = something;
setTimeout(function() { foo(object_array); }, 1000);

EDIT: Mes fonctions (ou au moins 1 itération d'entre eux je l'ai trouvé dans une sauvegarde ici)

Function.prototype.createDelegate = function(inst, args) { 
    var me = this;
    var delegate = function() { me.apply(inst, arguments); }
    return args ? delegate.createAutoDelegate.apply(delegate,args) : delegate;
};
Function.prototype.createAutoDelegate = function() {
    var args = arguments;
var me = this;
return function() { me.apply({}, args); }
};

DONNÉ:

function test(a, b) { alert(a + b); }

Utilisation:

setTimeout(test.createAutoDelegate(1, 2), 1000);

OU DONNÉ:

var o = { a:1, go : function(b) { alert(b + this.a); }}

Utilisation:

setTimeout(o.go.createDelegate(o,[5]), 1000);
//or
setTimeout(o.go.createDelegate(o).createAutoDelegate(5), 1000);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top