Frage

Ich möchte ein Objekt-Array an die setTimer Funktion in Javascript zu übergeben.

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

sind immer Fehler auf diesem Code.

** Hinweis: ** Entschuldigen Sie! einige Korrektur in meine Frage: Ist es möglich, in setInterval () Funktion

.
War es hilfreich?

Lösung

Verwenden Sie eine anonyme Funktion anstelle einer Zeichenfolge auf den ersten Parameter des SetTimeout oder setInterval Funktionen:

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

Warum es funktioniert:

Wenn Sie eine innere Funktion definieren, kann es auf die Variablen beziehen sich in ihrer Außeneinschließenden Funktion auch nach ihrer Mutter Funktionen bereits beendet haben.

Diese Sprache-Funktion wird aufgerufen, Schließungen .

Wenn Sie eine Zeichenfolge als erstes Argument dieser Funktionen übergeben, wird der Code intern mit einem Aufruf an die eval Funktion, und dies zu tun ist nicht betrachtet als gute Praxis .

Eval bietet direkten Zugriff auf die JavaScript-Compiler und führt den Code mit den Rechten des Anrufers übergeben wird, auch eval wiederholt / extensiv (dh Ihre setInterval-Funktion ist ein gutes Beispiel) führt zu Performance-Probleme.

Andere Tipps

Ich werde hier auf Lukes Antwort erweitern, weil es einen Anwendungsfall richtet sich die CMS (und die meisten Antworten auf diese Art von Frage) nicht.

Wenn Sie Ihre Argumente an den Funktionsaufruf binden zu der Zeit stellen Sie die Timeout , eine einfache Funktion Gehäuse wird nicht funktionieren:

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

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

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

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

Sie verwenden Firebug Konsole Unter der Annahme, die oben gibt „sofortige A“, „sofortige B“ und „sofortigen B“ 1 Sekunde später. den Wert zum Zeitpunkt der setTimeout Anruf Verwendung Lukes Trap-Verfahren zu binden. Die folgende ändert es ein wenig beliebige Funktionen und Argument Längen zu übernehmen:

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);

Nicht sicher, ob es einen Weg gibt, die Anruferkontext implizit passieren, aber es könnte weiterhin ein Zusammenhang Argument zu akzeptieren erweitert werden, wenn „dies“ nicht Sie dort.

zuerst, es ist 'setTimeout'

zweite, keine Zeichenfolge übergeben. Die wirkliche Lösung ist abhängig von dem Rest des Codes. Robusteste Art und Weise zu stoppen wäre der Anwendungsbereich:

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

Trap gibt eine Funktion, die das Array in ihrem Umfang gefangen hat. Dies ist eine generische Funktion, aber es spezifisch für Ihr Problem zu machen, kann es vereinfacht werden:

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

oder auch:

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

und schließlich kondensiert unten an:

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

EDIT: Meine Funktionen (oder mindestens 1 Iteration von ihnen, dass ich in einem Backup finden Sie hier)

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); }
};

Gegeben:

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

ANWENDUNG:

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

oder verschenkt:

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

ANWENDUNG:

setTimeout(o.go.createDelegate(o,[5]), 1000);
//or
setTimeout(o.go.createDelegate(o).createAutoDelegate(5), 1000);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top