Tag molily.
Interessant, damit hätte ich nicht gerechnet. Das muss eine seltsame Sonderregelung sein. Ich dachte, ein Function-Objekt sei == true. Dasselbe hätte ich auch von einem Object-Objekt erwartet. In beiden Fällen ist es nicht der Fall.
Eine mögliche Erklärung wäre der Kontext der Abfrage. if(function) ist scheinbar etwas anderes als if(function == true). Ersteres fragt die Existenz von function ab und ist true, wenn sie existiert und false, wenn sie nicht existiert.
Bei der zweiten Variante wird m.E. der "Wert" von function abgefragt, und der ist vom Typ String; das ominöse [native code], das man auch bei alert(function) erhält. Also liegt kein boolescher Wert vor, und die Abfrage wird immer false ergeben.
Ich habe mir x == true immer so vorgestellt: Der Operator == erfordert Boolesche Werte auf beiden Seiten des Operators, als wird auf beide Werte, sofern sie nicht schon Boolean sind, Boolean() angewendet: x == true wird intern erst einmal in Boolean(x) == true »umgeschrieben«. Und da Boolean(FunctionObjekt) true ergibt, dachte ich, dass FunctionObjekt == true ebenfalls true ergibt. Ich dachte, dasselbe wird bei if (x) angewendet: if (Boolean(x)).
Vielleicht mal ein anderes Beispiel. Angenommen, ich habe eine Eigenschaft "foo" vom Typ String mit dem Wert bar, also so:
foo = "bar";
alert(typeof window.foo); // 'String'
if(window.foo) alert("foo existiert"); // Meldung erscheint
if(window.foo = true) alert("foo ist true"); // keine Meldung
if(window.foo == "bar") alert("foo ist bar"); // Meldung erscheint
Dieses Beispiel demonstriert meine Vermutungen. Eine Abfrage if(foo) prüft die Existenz von foo, egal, ob Eigenschaft, Methode oder Objekt. Die Abfrage if(foo == wert) prüft, ob foo den Wert "wert" hat, und genau das funktioniert nur bei Eigenschaften, nicht aber bei Methoden oder Objekten. Es scheint sich also um eine Art "value of"-Abfrage zu handeln.
Siechfred