Was ist der Unterschied zwischen setInterval (func) und setInterval (function () {func ()}

9

Mein Ex-Boss hatte einen seltsamen Fehler, bei dem er setInterval mit einem langen Verzögerungsintervall verwendete :

> %Vor%

Node.js ist abgestürzt.

func kann sogar eine einfache Funktion sein, die einfach console.log('something') ist.

Jemand hat ihm vorgeschlagen, eine anonyme Funktion um func zu wickeln, und es hat sein Problem gelöst.

Soweit ich weiß, sollte es keinen Unterschied machen und wird zumindest in JavaScript-Browsern nicht als schlechte Praxis angesehen.

Gibt es einen Unterschied in Node.js zwischen

?
  • setInterval(func, delay)
  • setInterval(function(){func()}, delay)

oder ist es ein Fehler in Node.js?

UPDATE:

Fehlerbericht auf GitHub

    
gdoron 23.07.2015, 19:57
quelle

2 Antworten

1

Um Ihre Frage direkt anzusprechen: Ja, es gibt einen Unterschied. Nicht in der Funktionalität von setInterval , aber im Umfang, den die Funktion haben wird, wenn sie ausgeführt wird.

Szenario 1:

%Vor%

Alle 50 Minuten wird eine Stapelverfolgung auf die Konsole gedruckt. In diesem Fall wird, weil die Funktion console.trace direkt aufgerufen wurde, der Kontext von console beibehalten.

Szenario 2:

%Vor%

Dies wird einen Fehler verursachen, weil es mit dem Kontext des Bereichs aufgerufen wird, der es ausführt, nicht console . Um den Kontext zu erhalten, können Sie eine gebundene Kopie der Funktion übergeben:

%Vor%

Es scheint nicht das Problem Ihres Chefs heute reproduziert werden kann. Wie andere vorgeschlagen haben, könnte dies ein Problem mit der Speicherbereinigung sein. Ich würde eher geneigt sein zu glauben, dass die Funktion, die Ihr Chef anruft, von einem bestimmten Kontext abhing, der über eine anonyme Funktion aufrechterhalten wurde, aber verloren ging, wenn eine ungebundene Funktion übergeben wurde.

    
rrowland 23.08.2015 04:24
quelle
0

Es ist möglich, dass V8 die Garbage-Collection hinter den Kulissen durchführt, indem er jede Funktion, auf die Sie hier verweisen, als "func" entfernt. Dies würde "func" auf eine ungültige Funktion zeigen lassen.

Versuchen Sie, den Knoten mit dem folgenden Argument auszuführen:

%Vor%

... und dann in Ihrem Code nach dem Aufruf von setInterval (func, 10000):

%Vor%

... was die Speicherbereinigung in V8 auslöst. Da ich den Timer auf zehn Sekunden gesenkt habe, können Sie die Theorie testen, ohne eine ganze Stunde zu warten.

Es ist durchaus möglich, dass das Umbrechen eines anonymen Funktionsaufrufs verhindert, dass die Garbage-Collection Ihre eigentliche Funktion aus dem Speicher entfernt.

Beachten Sie, dass Sie auch mit:

beginnen können %Vor%

... die Garbage Collection von V8 protokolliert. Es könnte dir etwas Interessantes erzählen. Siehe Ссылка

    
Michael Blankenship 24.07.2015 00:46
quelle

Tags und Links