4

我正在努力寻找将传递给函数的所有参数传递给setTimeout. 也就是说,在下面的示例中,我传递了一个参数,但在我看来,随着它变得越来越复杂,它变得丑陋(多个参数)。我希望有一个干净的模式来做到这一点,因为我做了很多。

onSessionTimeComboChange: function (combo, newValue, oldValue, eOpts) {
    var me = this;
    me.newValue = newValue;
    setTimeout(function () {
        var x = me.newValue;
        debugger;
    }, 100);
}
4

2 回答 2

4

您无法访问回调中的主要函数变量的原因是,执行的代码在与调用它的函数不同的执行上下文setTimeout()中运行。简单来说,在回调中是不一样的。this

如果您不想使用提供函数将回调绑定到上下文的 Javascript 库(请参阅jQuery.proxyunderscore.bind),则必须编写自己的非本机setTimeout函数来解决此问题。

这是web api 文档中提出的解决方案(请参阅第 1 节The "this" problem):

window.setTimeout = function (vCallback, nDelay /*, argumentToPass1, argumentToPass2, etc. */) {
  var oThis = this, aArgs = Array.prototype.slice.call(arguments, 2);
  return __nativeST__(vCallback instanceof Function ? function () {
    vCallback.apply(oThis, aArgs);
  } : vCallback, nDelay);
};

如果您不想走那么远,对代码的改进是将参数作为参数传递给回调setTimeout

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]);

检查JavaScript web api以获取更多详细信息。

因此,在您的示例中,您可以编写如下内容:

setTimeout(function (x) {
    debugger;
}, 100, newValue);
于 2013-09-01T20:18:37.613 回答
4

Javascript 支持闭包,因此您可以毫不费力地将所需的任何参数传递给任何回调:

function bar(x, y, z) {
    console.log([x, y, z]);
}

for (var i=0; i<5; i++) {
    (function(x, y, z){
        setTimeout(function(){bar(x, y, z);}, i*1000+1000);
     })(i, i*2, i*3);
}

唯一棘手的部分是你不能只说

setTimeout(function(){bar(i, i*2, i*3)}, i*1000+1000);

因为闭包捕获了变量(不是当前值),所以i在这种情况下,所有注册的函数实际上都会使用相同的值。

于 2013-09-01T20:26:39.837 回答