【问题标题】:How to pass an Array object to the setInterval function如何将 Array 对象传递给 setInterval 函数
【发布时间】:2009-08-14 05:06:45
【问题描述】:

我想将一个对象数组传递给 Javascript 中的 setTimer 函数。

setTimer("foo(object_array)",1000);

这段代码出错了。

**注意:**对不起!我的问题中的一些更正: setInterval() 函数中是否可能。

【问题讨论】:

    标签: javascript settimeout setinterval


    【解决方案1】:

    在setTimeout 或setInterval 函数的第一个参数上使用匿名函数而不是字符串:

    // assuming that object_array is available on this scope
    setInterval(function () { foo(object_array); }, 1000);
    

    为什么会这样:

    当你定义一个内部函数时,它可以引用它们中存在的变量 即使在它们的父函数已经终止之后,外部封闭函数也是如此。

    此语言功能称为closures。

    如果您将字符串作为这些函数的第一个参数传递,代码将通过调用eval 函数在内部执行,这样做不被视为good practice .

    Eval 提供对 JavaScript 编译器的直接访问,并以调用者的权限执行它传递的代码,同样使用 eval 重复/广泛(即您的 setInterval 函数就是一个很好的例子)将导致性能问题。

    【讨论】:

    • setInterval() 中是否可以
    • 是的,这是可能的,这是最好的方法
    【解决方案2】:

    我将在这里扩展 Luke 的答案,因为它解决了 CMS(以及此类问题的大多数答案)没有解决的用例。

    如果您需要在设置超时时将参数绑定到函数调用,那么简单的函数封装将不起作用:

    echo = function (txt) { console.log(txt); };
    
    val = "immediate A";
    echo(val);
    
    val = "delayed";
    window.setTimeout(function () { echo(val); }, 1000);
    
    val = "immediate B";
    echo(val);
    

    假设你使用的是 Firebug 的控制台,上面会在 1 秒后输出“immediate A”、“immediate B”和“immediate B”。要在 setTimeout 调用时绑定值,请使用 Luke 的陷阱方法。以下对其进行了一些修改以接受任意函数和参数长度:

    echo = function (txt) { console.log(txt); };
    
    trap = function (fn, args) {
        return function() {
            return fn.apply(this, args);
        };
    };
    
    val = "immediate A";
    echo(val);
    
    val = "delayed";
    window.setTimeout( trap(echo, [val]), 1000);
    
    val = "immediate B";
    echo(val);
    

    不确定是否有办法隐式传递调用者的上下文,但如果“this”不能让你到达那里,它可以进一步扩展以接受上下文参数。

    【讨论】:

    • 您的陷阱版本与我的 createDelegate 和 trapScope 函数的想法相同。添加到我感兴趣的答案的底部
    • 我过去曾多次处理过这个问题,在看到您的解决方案之前,我总是选择尴尬的状态跟踪解决方法。我发现的几乎所有关于超时和间隔的主题都在谈论使用外壳而不考虑竞争条件。
    • +1 这个答案使我的额头免于撞墙。谢谢。
    【解决方案3】:

    首先,它是'setTimeout'

    其次,不要传递字符串。真正的解决方案取决于代码的其余部分。最可靠的方法是捕获范围:

    var obj_array = something;
    function trap(obj)
    {
        function exec() { foo(obj); }
        return exec;
    }
    setTimeout(trap(obj_array), 1000);
    

    trap 返回一个函数,该函数将您的数组困在其范围内。这是一个通用函数,但为了使其特定于您的问题,可以对其进行简化:

    var obj_array = something;
    function trap()
    {
        function exec() { foo(obj_array); }
        return exec;
    }
    setTimeout(trap(), 1000);
    

    甚至:

    var obj_array = something;
    function trap()
    {
        foo(obj_array);
    }
    setTimeout(trap, 1000);
    

    最后浓缩为:

    var obj_array = something;
    setTimeout(function() { foo(object_array); }, 1000);
    

    编辑: 我的函数(或者我在此处的备份中找到的至少 1 次迭代)

    Function.prototype.createDelegate = function(inst, args) { 
        var me = this;
        var delegate = function() { me.apply(inst, arguments); }
        return args ? delegate.createAutoDelegate.apply(delegate,args) : delegate;
    };
    Function.prototype.createAutoDelegate = function() {
        var args = arguments;
    var me = this;
    return function() { me.apply({}, args); }
    };
    

    给定:

    function test(a, b) { alert(a + b); }
    

    用法:

    setTimeout(test.createAutoDelegate(1, 2), 1000);
    

    或给定:

    var o = { a:1, go : function(b) { alert(b + this.a); }}
    

    用法:

    setTimeout(o.go.createDelegate(o,[5]), 1000);
    //or
    setTimeout(o.go.createDelegate(o).createAutoDelegate(5), 1000);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2012-10-28
      相关资源
      最近更新 更多