函数定义作为参数

时间:2011-09-22 18:36:10

标签: javascript

var cancel = setTimeout(function(){clearTimeout(cancel);}, 500);

var cancel = setTimeout(clearTimeout(cancel), 500);

学术问题:这两个表达式中的第一个起作用,而第二个表达不起作用。 setTimeout()方法接受一个函数和一个持续时间作为其参数,这两个例子都清楚地提供了这一点。唯一的区别是第一个是函数定义,第二个是函数调用。

如果将函数作为参数设计的函数只能处理函数定义,如何使用它可能需要的变量来提供该函数?例如:

stop = function(y){clearInterval(y)};
count = function(x){
    var t = 0,
    cancel = setInterval(function(){console.log(++t);},1000);
    setTimeout(stop(cancel),x);
};
count(5000);

上面的函数不起作用,因为它正在调用函数

stop = function(){clearInterval(cancel)};
count = function(x){
    var t = 0,
    cancel = setInterval(function(){console.log(++t);},1000);
    setTimeout(stop,x);
};
count(5000);

上述函数不起作用,因为stop()无权访问取消变量。

提前感谢您尝试让我了解此类问题的解决方法。

4 个答案:

答案 0 :(得分:2)

  

setTimeout()方法接受一个函数和一个持续时间作为它   论证和这两个例子都清楚地提供了这一点。该   唯一的区别是第一个是函数定义而第一个是   第二个是函数调用。

是的,但是当你调用一个函数时,你返回的结果可能是一个字符串,整数等...,所以你不再传递一个函数指针,而是一些字符串,整数,...这不是什么setTimeout函数作为第一个参数。

想想第二个例子:

var result = clearTimeout(cancel); // result is now an integer
setTimeout(result, 500); // invalid because setTimeout expects a function pointer
  

如果设计用于将函数作为参数的函数只能   处理函数定义,你如何提供它   函数与它可能需要的变量?

你可以使用闭包:

var stop = function(y) { clearInterval(y); };
var count = function(x) {
    var t = 0,
    var cancel = setInterval(function() { console.log(++t); }, 1000);
    setTimeout(function() { stop(cancel); }, x);
};
count(5000);

或简单地说:

var count = function(x) {
    var t = 0,
    var cancel = setInterval(function() { console.log(++t); }, 1000);
    setTimeout(function() { clearInterval(cancel); }, x);
};
count(5000);

答案 1 :(得分:1)

通过使用匿名函数包装函数调用,您可以完全像在第一行代码中那样解决它。

答案 2 :(得分:0)

尝试将cancel变量传递给匿名函数。

stop = function(cancel){clearInterval(cancel)};
count = function(x){
    var t = 0,
    cancel = setInterval(function(){console.log(++t);},1000);
    setTimeout(stop(cancel),x);
};
count(5000);

答案 3 :(得分:0)

局部变量总是被注入到嵌套范围中,例如通过function () { }由函数声明引入的范围。这就是通常所说的闭包,它是Javascript编程中的重要工具。

因此,setTimeout( function() { stop(cancel); },x);会这样做,内部函数可以访问外部作用域中定义的cancel变量(它甚至可以更改其值)。