//case 1
setInterval(function(){someFunc()},5000);
var someFunc=function (){
alert('in the someFunc');
}
//case 2
setInterval(someFunc,5000);
var someFunc=function (){
alert('in the someFunc');
}
这两种情况有什么区别?在编译阶段,情况1和情况2都是someFunc未定义的,在执行阶段,someFunc在调用setInterval函数的地方没有改变,为什么情况1可以成功?情况1和案例2之间的区别仅在于案例1中的封闭。封闭在案例1中的作用是什么?
答案 0 :(得分:1)
通过var
声明,变量是"悬挂"。意思是,即使在为其分配任何内容之前,它也作为名称存在于范围内。因此它可以被关闭"。在执行间隔时,someFunc
的值是一个函数,因此可以调用它。
在第二种情况下,someFunc
在您将undefined
传递给setInterval
时仍然包含值undefined
。由于var foo = 'bar';
function () {
console.log(foo); // undefined
var foo = 'baz';
}
不是函数,因此在您想要设置间隔时不能将其用作回调。
"起重"简而言之:
var foo
内部var foo
阴影外部{{1}},甚至在分配任何内容之前。它已经存在于范围内,以至于它会影响同名的其他变量。
答案 1 :(得分:0)
在第一种情况下,您定义的函数将在执行时查找someFunc,在这种情况下5秒后。
在第二个例子中,你告诉setInterval在那个时刻someFunc存在,但事实并非如此。
答案 2 :(得分:0)
它在第二种情况下不起作用,因为您正在递交对函数的引用,此时此函数为undefined
。如果您要对此功能重新排序:
var someFunc=function (){
alert('in the someFunc');
}
setInterval(someFunc,5000);
然后会定义someFunc
,setInterval
可以使用该值。
第一种方法是有效的,因为闭包将在执行时(在5秒内)结束("复合"与它自己的上下文,你可以说,或者"继承"该上下文)定义闭包的上下文。因此,此时定义了someFunc
。