zoukankan      html  css  js  c++  java
  • setTimeout 传参

    http://blog.useasp.net/archive/2012/11/03/the-problem-when-setTimeout-invoke-a-function-with-an-object-parameter.aspx

    在javascript中调用setTimeout的时候,如果我们是无参数的方法,调用相对简单,直接像下面这样调用就可以了

    code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function fun(){
        // do something here.
    }
     
    // 第一个方法
    setTimeout(fun(), 100);
     
    // 第二个方法
    setTimeout(fun, 100);
     
    // 第三个方法
    setTimeout("fun()", 100);

    在有参数的时候,如果仅仅是字符串类型,也还好解决,第三种方法为我们提供了依据,可以像下面这样:

    code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function fun1(p){
        // do something here;
    }
     
    // 注意这里有两个方法
    // No.1:将参数写死,直接调用
    setTimeout("fun1('parameters')", 100);
     
    //No. 2: 在程序中如果要动态的调用,则可以使用组合参数的形式
    setTimeout("fun1('" + paramenter + "')", 100);
    //注意,这里需要单引号。

    不过事情并非总是如此顺利,我们有的时候需要传递的是对象(这个需求越来越普遍了)。如果是按照这种传参的方式,结果将不可能是我们想要的。而直接像下面这样使用,你应该会发现,是行不通的:

    code
    1
    2
    3
    4
    5
    6
    7
    8
    function fun2(objectP){
        // do something here;
    }
     
    // 注意,这样是会报错的
    // setTimeout(fun2(obj), 100);
    // 在Chrome下面得到的错误是:Uncaught SyntaxError: Unexpected identifier,但是有的时候能运行<br>//这中情况对于在Chrome下的调试是非常的隐晦的。
    // BTW:你可以试试在IE下面的报错是怎么样的~

     为了能够顺利调用,我们要做一些工作,最简单直接的就是重写setTimeout了,霸王硬上弓:

    code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function fun2(objectP){
        // do something here;
    }
     
    var $st = window.setTimeout;
    // 这里覆盖了setTimeout方法,如果需要原始方法的时候,可以使用$st
    window.setTimeout = function(funRef, delayTime) {
        if (typeof funRef === 'function') {
            var args = Array.prototype.slice.call(arguments,2);
            var f = function(){ funRef.apply(null, args); }; // 返回无参数方法
            return $st(f, delayTime);//调用无参数方法
        }
        return $st(funRef,delayTime);
    }

     在代码中我们能看到,为了后继可以使用原生的setTimeout,我们不得不将setTimeout放入到变量中,这样就可以在有必要的时候调用了。这个方法最大的问题是对原生的setTimeout进行了覆盖,如果代码中原有调用了setTimeout,可能就会出现不必要的麻烦了。为此我们需要一种更简单,并且能够更加容易维护的方法。

    分析这个方法,最根本就是让setTimeout调用个无参数的方法,因此,我们可以这样:

    code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 对方法进行改进
    function fun2(objectP){
        return function(){
            // do something here;
            // do(objectP);
        }
    }
     
    // 调用
    setTimeout(fun2(p), 100);

     这样,就可以直接在setTimeout中调用了。这样就不会和现有的代码产生冲突,并且,在维护的时候,也能更加的方便。 

  • 相关阅读:
    Calling a parent window function from an iframe
    JSON with Java
    Posting array of JSON objects to MVC3 action method via jQuery ajax
    What's the difference between jquery.js and jquery.min.js?
    jquery loop on Json data using $.each
    jquery ui tabs详解(中文)
    DataTables warning requested unknown parameter
    Datatables 1.10.x在命名上与1.9.x
    jQuery 1.x and 2.x , which is better?
    DataTabless Add rows
  • 原文地址:https://www.cnblogs.com/jcz1206/p/4775812.html
Copyright © 2011-2022 走看看