Simple parameter passing within a setInternal() call?

Discussion in 'Javascript' started by Tuxedo, Feb 11, 2012.

  1. Tuxedo

    Tuxedo Guest

    How can a simple string parameter be passed between two functions while
    inside a setInterval call? For example:

    function initialFunction(x){
    alert(x);
    setInterval('repeatingStuff(x)',5000);
    }

    function repeatingStuff(x){
    alert(x);
    }
    ....

    <a href="..." onclick="initialFunction('param_x');">stuff</a>

    But the error "x is not defined" results from ..Stuff(x) in
    setInterval('repeatingStuff(x)',5000). How can the parameter between the
    two functions be passed within the setInteval bit?

    Many thanks,
    Tuxedo
     
    Tuxedo, Feb 11, 2012
    #1
    1. Advertisements

  2. Tuxedo

    Tuxedo Guest

    Re: Simple parameter passing within a setInterval() call?

    Tuxedo wrote:

    [...]

    > setInterval('repeatingStuff(x)',5000). How can the parameter between the


    I thought I had tried this already but I must have simply got the quoting
    wrong. Of course, this works:
    setInterval('repeatingStuff("' + x + '")',5000);

    Tuxedo
     
    Tuxedo, Feb 11, 2012
    #2
    1. Advertisements

  3. Tuxedo schrieb:
    > How can a simple string parameter be passed between two functions while
    > inside a setInterval call? For example:
    >
    > function initialFunction(x){
    > alert(x);
    > setInterval('repeatingStuff(x)',5000);
    > }
    >
    > function repeatingStuff(x){
    > alert(x);
    > }
    > ...
    >
    > <a href="..." onclick="initialFunction('param_x');">stuff</a>
    >
    > But the error "x is not defined" results from ..Stuff(x) in
    > setInterval('repeatingStuff(x)',5000). How can the parameter between the
    > two functions be passed within the setInteval bit?


    x must be in the scope of the second function. Therefore, you should
    define repeatingStuff inside the initialFunction:

    function initialFunction(x){
    alert(x);
    function repeatingStuff(x){
    alert(x);
    }
    setInterval(repeatingStuff,5000);
    }

    or shorter:

    function initialFunction(x){
    alert(x);
    setInterval( function(x){
    alert(x);
    }, 5000);
    }

    You should pass a function to setIntervall/Timeout, instead of a code to
    be evaluated each time (slow & buggy).

    Another alternative is to use bind() or other functions, to return a
    function which calls repeatingStuff with the needed parameters:

    function repeatingStuff(){...}
    function initialFunction(x){
    alert(x);
    setInterval( repeatingStuff.bind(this, x), 5000);
    }

    Greetings,
    Bergi
     
    Andreas Bergmaier, Feb 11, 2012
    #3
  4. Andreas Bergmaier wrote:

    > Tuxedo schrieb:
    >> How can a simple string parameter be passed between two functions while
    >> inside a setInterval call? For example:
    >>
    >> function initialFunction(x){
    >> alert(x);
    >> setInterval('repeatingStuff(x)',5000);
    >> }
    >>
    >> function repeatingStuff(x){
    >> alert(x);
    >> }
    >> ...
    >>
    >> <a href="..." onclick="initialFunction('param_x');">stuff</a>
    >>
    >> But the error "x is not defined" results from ..Stuff(x) in
    >> setInterval('repeatingStuff(x)',5000). How can the parameter between the
    >> two functions be passed within the setInteval bit?

    >
    > x must be in the scope of the second function.


    In the scope _chain_.

    > Therefore, you should define repeatingStuff inside the initialFunction:
    >
    > function initialFunction(x){
    > alert(x); ^

    ^--------------'
    > function repeatingStuff(x){

    ^
    > alert(x); |

    ^--------------'
    > }
    > setInterval(repeatingStuff,5000);
    > }
    >
    > or shorter:
    >
    > function initialFunction(x){
    > alert(x); ^

    ^--------------'
    > setInterval( function(x){
    > alert(x); ^

    ^------------'
    > }, 5000);
    > }


    This does not work, because in the context of the function (referred by
    `repeatingStuff'), `x' is bound to the inner function's argument `x' (which
    is not passed a useful value from the DOM implementation anyway) and not to
    that of the inner function's definition context. Please test before you
    post, or clearly mark code as untested.

    > You should pass a function to setIntervall/Timeout, instead of a code to
    > be evaluated each time (slow & buggy).


    The function code also will have to be evaluated each time. But it is true
    that evaluating the string value as a Program is less efficient and more
    error-prone than that.

    > Another alternative is to use bind() or other functions, to return a
    > function which calls repeatingStuff with the needed parameters:
    >
    > function repeatingStuff(){...}
    > function initialFunction(x){
    > alert(x);
    > setInterval( repeatingStuff.bind(this, x), 5000);
    > }


    This works in implementations of ECMAScript 5.x or where you have a suitable
    scripting framework that emulates Function.prototype.bind(), but it is
    unnecessarily inefficient by comparison.


    PointedEars
    --
    > If you get a bunch of authors […] that state the same "best practices"
    > in any programming language, then you can bet who is wrong or right...

    Not with javascript. Nonsense propagates like wildfire in this field.
    -- Richard Cornford, comp.lang.javascript, 2011-11-14
     
    Thomas 'PointedEars' Lahn, Feb 11, 2012
    #4
  5. Thomas 'PointedEars' Lahn schrieb:
    > Andreas Bergmaier wrote:
    >> Tuxedo schrieb:
    >>> How can a simple string parameter be passed between two functions while
    >>> inside a setInterval call?

    >>
    >> function initialFunction(x){
    >> alert(x); ^

    > ^--------------'
    >> setInterval( function(x){
    >> alert(x); ^

    > ^------------'
    >> }, 5000);
    >> }

    >
    > This does not work, because in the context of the function (referred by
    > `repeatingStuff'), `x' is bound to the inner function's argument `x' (which
    > is not passed a useful value from the DOM implementation anyway) and not to
    > that of the inner function's definition context.


    I'm sorry, I forgot the essential thing when copying the example code :-(
    @Tuxedo: The thing is to have only one variable "x". The code should be

    function initialFunction(x){
    alert(x);
    setInterval( function(){
    alert(x);
    }, 5000);
    }

    >> Another alternative is to use bind() or other functions, to return a
    >> function which calls repeatingStuff with the needed parameters

    >
    > This works in implementations of ECMAScript 5.x or where you have a suitable
    > scripting framework that emulates Function.prototype.bind(), but it is
    > unnecessarily inefficient by comparison.


    Is it? Unnecessarily in this case, yes, but if you have defined
    "repeatingStuff" elsewhere it is imho much more elegant than coding

    var x;
    setInterval( function(){
    doRepeatingStuffWith(x);
    }, 5000);

    Bergi
     
    Andreas Bergmaier, Feb 11, 2012
    #5
  6. Andreas Bergmaier wrote:

    > Thomas 'PointedEars' Lahn schrieb:
    >> Andreas Bergmaier wrote:
    >>> Another alternative is to use bind() or other functions, to return a
    >>> function which calls repeatingStuff with the needed parameters

    >>
    >> This works in implementations of ECMAScript 5.x or where you have a
    >> suitable scripting framework that emulates Function.prototype.bind(), but
    >> it is unnecessarily inefficient by comparison.

    >
    > Is it? Unnecessarily in this case, yes, but if you have defined
    > "repeatingStuff" elsewhere it is imho much more elegant than coding
    >
    > var x;
    > setInterval( function(){
    > doRepeatingStuffWith(x);
    > }, 5000);


    That is not even equivalent in the first place. Clearly you do not
    understand bind(). Please refrain from recommending it until you do.


    PointedEars
    --
    When all you know is jQuery, every problem looks $(olvable).
     
    Thomas 'PointedEars' Lahn, Feb 11, 2012
    #6
  7. Thomas 'PointedEars' Lahn schrieb:
    > Andreas Bergmaier wrote:
    >> Thomas 'PointedEars' Lahn schrieb:
    >>> Andreas Bergmaier wrote:
    >>>> Another alternative is to use bind() or other functions, to return a
    >>>> function which calls repeatingStuff with the needed parameters
    >>>
    >>> This works in implementations of ECMAScript 5.x or where you have a
    >>> suitable scripting framework that emulates Function.prototype.bind(), but
    >>> it is unnecessarily inefficient by comparison.

    >>
    >> Is it? Unnecessarily in this case, yes, but if you have defined
    >> "repeatingStuff" elsewhere it is imho much more elegant than coding
    >>
    >> var x;
    >> setInterval( function(){
    >> doRepeatingStuffWith(x);
    >> }, 5000);

    >
    > That is not even equivalent in the first place. Clearly you do not
    > understand bind(). Please refrain from recommending it until you do.


    I do, and I never said it was to be equivalent. Of course bind() needs a
    context to set, dereferences x, and builds a new function. That even
    could be useful (I'm not sure what the OP needs), so why shouldn't I
    mention it as an alternative?

    Bergi
     
    Andreas Bergmaier, Feb 12, 2012
    #7
  8. Tuxedo

    Tuxedo Guest

    Re: Simple parameter passing within a setInterval() call?

    Andreas Bergmaier wrote:

    [...]

    > @Tuxedo: The thing is to have only one variable "x". The code should be
    >
    > function initialFunction(x){
    > alert(x);
    > setInterval( function(){
    > alert(x);
    > }, 5000);
    > }


    Thanks - works great! Much better than my quoted parameters as in
    Stuff("' + x + '")',5000 etc.

    Tuxedo

    [..]
     
    Tuxedo, Feb 12, 2012
    #8
  9. Re: Simple parameter passing within a setInterval() call?

    In comp.lang.javascript message <jh6g5k$bfn$>, Sat,
    11 Feb 2012 20:39:32, Tuxedo <> posted:

    >Tuxedo wrote:
    >
    >[...]
    >
    >> setInterval('repeatingStuff(x)',5000). How can the parameter between the

    >
    >I thought I had tried this already but I must have simply got the quoting
    >wrong. Of course, this works:
    >setInterval('repeatingStuff("' + x + '")',5000);


    That will use the value of x at call time, if x is simple or an
    expression.

    Another way is to pass x as a global variable; or, perhaps more clearly,
    as a property of a global Object reserved and named, or otherwise
    suitable, for the purpose. Actually, repeatingStuff is such an Object.

    That eliminates conversions to/from String, which may be inexact.

    --
    (c) John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v6.05 MIME.
    Web <http://www.merlyn.demon.co.uk/> - FAQish topics, acronyms, & links.
    Proper <= 4-line sig. separator as above, a line exactly "-- " (SonOfRFC1036)
    Do not Mail News to me. Before a reply, quote with ">" or "> " (SonOfRFC1036)
     
    Dr J R Stockton, Feb 12, 2012
    #9
    1. Advertisements

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.
Similar Threads
  1. dawg1998
    Replies:
    0
    Views:
    1,685
    dawg1998
    Jul 12, 2006
  2. mark4asp
    Replies:
    2
    Views:
    2,585
    Harry Haller
    Nov 7, 2006
  3. Replies:
    4
    Views:
    854
    Matteo
    Mar 29, 2007
  4. Mister B
    Replies:
    8
    Views:
    1,031
    Nick Keighley
    Aug 26, 2010
  5. deadpickle
    Replies:
    1
    Views:
    1,749
    Jens Thoms Toerring
    Nov 7, 2010
  6. Wladimir Borsov
    Replies:
    4
    Views:
    574
    Tintin
    May 11, 2006
  7. Steve
    Replies:
    8
    Views:
    313
    Thomas 'PointedEars' Lahn
    Feb 8, 2006
  8. Yang

    Simple Parameter Passing Problem

    Yang, Apr 16, 2007, in forum: Javascript
    Replies:
    3
    Views:
    194
Loading...