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()无权访问取消变量。
提前感谢您尝试让我了解此类问题的解决方法。
答案 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
变量(它甚至可以更改其值)。