We all know that passing a string to setTimeout (or setInterval) is evil, because it is run in the global scope, has performance issues, is potentially insecure if you’re injecting any parameters, etc. So doing this is definitely deprecated:
setTimeout('doSomething(someVar)', 10000);
in favour of this:
setTimeout(function() {
doSomething(someVar);
}, 10000);
My question is: can there ever be a reason to do the former? Is it ever preferable? If it isn’t, why is it even allowed?
The only scenario I’ve thought of is of wanting to use a function or variable that exists in the global scope but has been overridden in the local scope. That sounds to me like poor code design, however…
You can always use global variables by accessing them as properties of the window object, like
window.globalVar(though using globals is indeed not a good practice), so no, I don’t think there is ever a good reason to use the deprecated syntax.It is probably allowed for historical reasons: as Felix Kling mentioned, the original syntax did only allow to pass a string of code:
If browsers don’t support the use of a string as first argument to
setTimeoutandsetIntervalanymore, there will be lots of code on the internet that doesn’t function anymore.