关闭在下面的代码中做了什么?

时间:2015-01-28 08:07:31

标签: javascript closures

//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中的作用是什么?

3 个答案:

答案 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);

然后会定义someFuncsetInterval可以使用该值。

第一种方法是有效的,因为闭包将在执行时(在5秒内)结束("复合"与它自己的上下文,你可以说,或者"继承"该上下文)定义闭包的上下文。因此,此时定义了someFunc

相关问题