0

我有以下代码:

function fn($){
  return function(){
    innerFn = function(){
      setTimeout(show, 1000);
    };

    show = function(){
      $.alert("TEST");
    }
  }
}

但是,一秒钟后,当函数show运行时,它说 $ 未定义。我该如何解决这个问题?

4

3 回答 3

2

如何将参数传递给 setTimeout 中的函数

setTimeout 具有用于添加参数的内置机制

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

用它。

如果你要使用this - 你应该小心。但这是另一个问题。

于 2013-07-22T05:41:14.320 回答
1

这里有很多事情在起作用。最重要的是你的 setTimeout 永远不会被调用,因为 innerFn 永远不会被调用。这应该可以解决问题。

function fn($){
  return function(){
    setTimeout(function(){
      $.alert("TEST");
    }, 1000);
  }
}

fn(window)(); //triggers your alert after 1000ms
于 2013-07-22T05:45:52.013 回答
1

您的代码没有任何意义,因为没有调用任何内容:

function fn($){
  return function(){
    innerFn = function(){
      setTimeout(show, 1000);
    };

    show = function(){
      $.alert("TEST");
    }
  }
}

假设我正在调用fnpass window,然后返回一个函数,我可以执行该函数。但是因为这个函数只包含函数声明——你也忘记了var所以你污染了全局范围,这很糟糕——什么都没有发生。

您至少需要在内部调用一个函数,例如:

function fn($){
  return function(){
    var innerFn = function(){
      setTimeout(show, 1000);
    };

    var show = function(){
      $.alert("TEST");
    }

    innerFn();
  }
}

fn(window)();

这会奏效。但是,这绝对是多余的。你可以只拥有:

function fn($){
  return function(){
    function show(){
      $.alert("TEST");
    }

    setTimeout(show, 1000);
  }
}

以获得相同的结果。但是,如果您的目标只是将参数绑定到setTimeout,则可以使用bindsetTimeout您可以使用文档中所说的第三个参数,但由于遗留原因,IE 似乎不支持它。

因此,带有bindwill 的示例如下所示:

function show() {
    this.alert('test');
}

setTimeout(show.bind(window), 1000);

另请注意window,默认情况下这是全局对象,因此通常您不必这样做,就alert足够了。但是,我想这不是您的实际代码,而只是一个测试,正如警报的字符串所说。

如果您更喜欢将其window作为第一个参数,并且您对 context object 不感兴趣,则this可以执行以下操作:

function show($) {
    $.alert('test');
}

setTimeout(show.bind(null, window), 1000);
于 2013-07-22T05:59:06.110 回答