函数对象上的javascript闭包

函数对象上的javascript闭包,javascript,closures,Javascript,Closures,为什么闭包行为在这里不起作用: 函数init(){ for(var i=1;iEcmaScript 6中的函数声明现在是块范围的,就像let声明一样(与let不同的是,变量是在外部全局/函数范围中声明的) 您的代码在全局上等同于 for(var i=1;i实际上有两个timers。当解释器在这样的循环中运行函数声明时,它将覆盖外部作用域中以前的函数名(如果存在这样的函数)。此代码段可能会更清楚: 用于(var i=1;我请先格式化代码,然后再让其他人查看。您的问题是什么?您的代码符合我的预

为什么闭包行为在这里不起作用:

函数init(){

for(var i=1;iEcmaScript 6中的函数声明现在是块范围的,就像
let
声明一样(与
let
不同的是,变量是在外部全局/函数范围中声明的)

您的代码在全局上等同于

for(var i=1;i实际上有两个
timer
s。当解释器在这样的循环中运行函数声明时,它将覆盖外部作用域中以前的函数名(如果存在这样的函数)。此代码段可能会更清楚:


用于(var i=1;我请先格式化代码,然后再让其他人查看。您的问题是什么?您的代码符合我的预期。对于您的下一个测试:您不必等待10000毫秒。事实上,即使超时0也足够。问题是计时器所取的值。我对0进行了编辑。我认为使用n会更清晰编号为this.timerIf如果我在函数内部执行
var k=I
,并在函数内部执行
console.log(k)
,那么它将保留对外部I的引用。EcmaScript 6中的
函数声明现在是块范围的
否,它们仍然被分配给外部(函数)范围,即使赋值仅在解释器到达
函数时发生line@CertainPerformance请阅读我链接到的页面的第7章。它会更清晰。它被提升并阻塞作用域。@mplungjan这一点。如果timer是事件处理程序,我可能会有问题。这两个timer.I是否都应该继承I fr的值外部?即使在第二个计时器块被定义/运行之后?否,因为
timer.i
在循环内同步分配给单独的计时器。
timer.i
不是对
i
的最终值的引用,而是分配给
i
属性时的
i
的副本是的,它仍然让我困惑,为什么它对var k=i的想法不应该相同,每个var k=i也属于不同的计时器。或者基本上它不调用函数,所以不进行分配?谢谢你的帮助。我不知道你指的是什么,但是
var
被提升,并且有非直观的功能在作用域而不是块作用域上(通常,始终使用
const
let