Javascript 闭包在下面的代码中做什么?

Javascript 闭包在下面的代码中做什么?,javascript,closures,Javascript,Closures,这两种情况的区别是什么?在编译阶段,情况1和情况2的someFunc都未定义,在执行阶段,在调用setInterval函数的地方,someFunc未更改,为什么案例1能够成功?案例1和案例2之间的唯一区别是案例1中的关闭。案例1中的关闭做了什么?通过var声明,变量是“highed”。也就是说,它作为名称存在于范围中,甚至在为其分配任何内容之前。因此,它可以“关闭”。在执行间隔时,someFunc的值是一个函数,因此可以调用它 在第二种情况下,someFunc在将其传递到setInterval时

这两种情况的区别是什么?在编译阶段,情况1和情况2的someFunc都未定义,在执行阶段,在调用setInterval函数的地方,someFunc未更改,为什么案例1能够成功?案例1和案例2之间的唯一区别是案例1中的关闭。案例1中的关闭做了什么?

通过
var
声明,变量是“highed”。也就是说,它作为名称存在于范围中,甚至在为其分配任何内容之前。因此,它可以“关闭”。在执行间隔时,
someFunc
的值是一个函数,因此可以调用它

在第二种情况下,
someFunc
在将其传递到
setInterval
时仍然包含值
undefined
。由于
undefined
不是函数,因此在设置间隔时不能将其用作回调函数

简而言之,“吊装”是指:

//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');
}

内部的
var foo
甚至在分配任何内容之前就已经覆盖了外部的
var foo
。它已经存在于作用域中,以至于它会遮挡同名的其他变量。

在第一种情况下,您定义的函数将在执行someFunc时(在这种情况下是5秒后)查找它


在第二个示例中,您告诉setInterval,此时someFunc存在,但事实并非如此。

在第二个示例中,它不起作用,因为您正在提交一个函数的引用,而此时,
未定义。如果要对函数重新排序,请执行以下操作:

var foo = 'bar';
function () {
    console.log(foo); // undefined
    var foo = 'baz';
}
然后将定义
someFunc
,并且
setInterval
可以使用该值


第一种方法之所以有效,是因为闭包将在执行时(5秒后)关闭(可以说,将上下文与自己的上下文组合,或者“继承”该上下文)闭包定义的上下文。因此,此时定义了
someFunc

嗯,
someFunc
是存在的,但它的值不是一个函数。我应该说它是作为一个函数存在的:DIt实际上是将变量与其值区分开来。变量存在,但它持有的值不是函数。变量永远不会“作为函数存在”;变量存在或不存在。听起来好像父范围的关闭将在执行时发生,而不是在创建时发生。是的,这就是这里发生的。。。如果它真的很重要,因为上下文可能只是作为一个整体链接,那么它就不重要了。但它确实发生在创建时。@Bergi那么我想上下文只是作为一个整体,作为一个指针,在创建时被关闭。。。这不违背我的逻辑,为什么案例2 someFunc不能“结束”?我不明白!因为在你的第二个案例中,你没有结束。您需要将回调函数传递给
setInterval
。在第一种情况下,传递一个匿名函数;它恰好关闭在someFunc上。在第二种情况下,您只是尝试将
undefined
作为对
setInterval
的回调传递。你没有关闭任何东西,因为你没有写任何函数。这意味着只有闭包可以访问外部作用域直到窗口,对吗?不知道你在说什么。在函数内部,你可以访问在定义函数的点上作用域中的所有变量。这就是“周边”范围,周边范围,周边范围等等,一直到顶层范围。如果函数是异步执行的,就像您的情况一样,那么这些变量仍然可以访问;在这种情况下,据说它们“关闭了”。
var someFunc=function (){
    alert('in the someFunc');
}
setInterval(someFunc,5000);