Javascript 变量,为window.onload函数的循环定义insde,获取窗口级别的全局范围

Javascript 变量,为window.onload函数的循环定义insde,获取窗口级别的全局范围,javascript,loops,global-variables,onload,Javascript,Loops,Global Variables,Onload,我有一个函数设置为window.onload event。在该函数中,我有一个for循环,它在每次迭代中将变量unit定义为GAME.unit类型的新对象。因此,我在窗口范围中有一个变量单元,保存最后创建的对象!我一直认为,循环中的变量是面向循环的。我仔细检查了一遍,代码中的任何地方都没有关于单位变量的其他声明。我做错了什么 无论变量声明出现在何处,都会在执行任何代码之前进行处理。使用var声明的变量的作用域是其当前执行上下文,该上下文可以是封闭函数,也可以是在任何函数之外声明的变量的全局上下

我有一个函数设置为window.onload event。在该函数中,我有一个for循环,它在每次迭代中将变量unit定义为GAME.unit类型的新对象。因此,我在窗口范围中有一个变量单元,保存最后创建的对象!我一直认为,循环中的变量是面向循环的。我仔细检查了一遍,代码中的任何地方都没有关于单位变量的其他声明。我做错了什么

无论变量声明出现在何处,都会在执行任何代码之前进行处理。使用var声明的变量的作用域是其当前执行上下文,该上下文可以是封闭函数,也可以是在任何函数之外声明的变量的全局上下文

-

var
将变量的作用域设置为函数,而不是循环


要将变量的作用域设置为块,请使用

您的
控制台。log()
语句位于函数内部!你看不到全球范围!当然它是在函数内部,但它不是在循环内部,变量是在循环中创建的。如果我把它放在代码的其他地方,变量仍然在那里。
var
语句声明了一个闭包范围内的变量。(这意味着变量可以在整个函数体中访问。)如果希望变量只能在循环中访问,则需要使用
let
const
。您的
console.log
也在函数内部,因此它实际上不在窗口范围内。@Razem-这里没有闭包。只有当一个函数有一个作用域为它的变量,在该函数内声明了另一个函数,内部函数使用外部函数中的变量,并且内部函数的寿命超过了外部函数的寿命时,才能得到闭包。不要把闭包和函数混为一谈。真是个奇迹,我从来都不知道循环中的变量会有这样的行为。。。