3

How to use setInterval without using global variables? I'd prefer to wrap all variables of function invoked by setInerval in some kind of closure, like so:

var wrap = function (f){
 var local1, local2, ...;
 return function () { return f(); }
}

This doesn't work, but the idea is that I'd pass wrap(f) instead of f to setInterval, so that locals for f are nicely wrapped and don't pollute the global scope.

2 Answers 2

4

javascript don't have dynamic binding.(except this keyword)

use anonymous function can archive your idea. (it called closure)

var fnc = function(){
    var local1, local2;

    return function(){
         // using local1, local2
    }
};

setInterval(fnc, 1000);
Sign up to request clarification or add additional context in comments.

2 Comments

If I have two functions I use in setInterval calls, there's no other way to exchange data between them, than using global variables?
@user1367401 Yes and no. The variables will need to be declared in an outer scope for both functions to have them in their scope, but that doesn't have to be the global scope. You can define all of them within the same closure -- Revealing Module Pattern.
2

I assume you're looking for something like this...

var wrap = function (f){
    var locals = Array.prototype.slice.call(arguments, 1);
    return function () { f.apply(this, locals); }
};


function logger_func() {
    console.log.apply(console, arguments);
}

for (var i = 0; i < 10; i++) {
    setTimeout( wrap(logger_func, i, "foo_" + i), // <-- wrapping i
                i * 1000 );
}

Note that modern environments let you pass extra arguments to setTimeout...

for (var i = 0; i < 10; i++) {
    setTimeout(logger_func, i * 1000, i, "foo_" + i);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.