> I tried

>   window.setInterval([...function...], 500, 'hello world');

> in IE the argument wasn't passed.

Indeed, the extended with-parameters form of setTimeout/setInterval is not
globally supported, unfortunately.

> window.setInterval("external(\""+hello world+"\")", 500);

> This is ugly and clumsy and I hate it

Quite right. Most people use this kind of solution but it is very nasty.

> anyone with a better suggestion??

JavaScript can do closures. So this:

  function greet(greetee) {
    var greeting= 'Hello '+greetee;
    var f= function() { alert(greeting) };
    setInterval(f, 5000);

will work. When you define a function from inside another function, the
variables in the outer function scope are kept and are accessible to the
inner function. (In the above case, the local variable 'greeting', as well
as 'greetee' and 'f' for that matter.)