JavaScript 循环变量作用域

IT技术 javascript variables for-loop scope
2021-01-26 15:00:52

只是一个关于 JavaScript 变量范围的快速问题。

为什么该alert()函数打印的值i而不是返回undefined

$(document).ready(function () {
    for(var i = 0; i < 10; i += 1){
    }

     alert("What is 'i'? " + i);
});

我对 JS 相当陌生,在我涉足过的几乎所有其他语言中,for 循环范围内的声明将包含该循环的值,但在这种情况下不是,为什么?

What is 'i'? 10'打印。

5个回答

有关-loop的“初始化参数”,请参阅 MDN for

表达式(包括赋值表达式)或变量声明。通常用于初始化计数器变量。此表达式可以选择使用 var 关键字声明新变量。这些变量不是循环的局部变量,即它们在 for 循环所在的同一范围内。该表达式的结果被丢弃。

JavaScript 在constlet被引入之前没有块作用域,只是var函数作用域。由于 的初始化i在一个函数内,该变量可在同一函数中的任何其他地方访问。

来自MDN

重要提示:JavaScript 没有块作用域。块中引入的变量的作用域是包含函数或脚本,并且设置它们的效果在块本身之外持续存在。换句话说,块语句不引入作用域。尽管“独立”块是有效的语法,但您不希望在 JavaScript 中使用独立块,因为如果您认为它们在 C 或 Java 中执行此类块,则它们不会执行您认为它们所做的事情。

感谢您的输入 :)
2021-03-18 15:00:52
我能理解 for 循环也是一种函数吗?
2021-03-26 15:00:52
在链接页面上,看看let关键字
2021-04-03 15:00:52
@simonarame 但是Java 和 JavaScript 不一样,所以这无关紧要...
2021-04-04 15:00:52
这是很好的可重复性,但会破坏 sun 的 java 试图建立的内容。
2021-04-06 15:00:52

javascript 人员正试图解决这个问题!

EcmaScript6(又名 EcmaScript 2015)是去年夏天通过的最新版本的 javascript,浏览器才刚刚开始支持其功能。

其中一项功能是具有“let”表达式的块范围局部变量。截至目前(2016 年 4 月),除 Safari 外,大多数当前版本的主要浏览器都支持此功能。很少有移动浏览器支持这一点。

您可以在此处阅读有关它的更多信息(特别是,请参阅“for 循环中的 let 范围变量”部分):https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

您可以在此处检查当前浏览器支持(查找行 Bindings -> let):https : //kangax.github.io/compat-table/es6/

用更多信息更新你的答案。规范是官方的。谢谢
2021-03-15 15:00:52

与其他语言(例如:Java、C++、C)不同,JavaScript 不支持块作用域。一旦你在循环或函数中声明了一个变量,它的作用域就在函数体内,如果你这样做了

for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

在这里,您i将成为一个全局变量,并j成为循环所在的函数或脚本的局部变量

确实如此var,但现在需要考虑let关键字
2021-03-18 15:00:52
for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

说上面创建了一个全局变量是不正确的i我相信你应该总是使用var来声明变量(除非你是故意想要一个“属性”而不是一个“变量”——这在 99.99% 的 JS 编码场景中是不太可能的......)

var在分配初始值时省略i不是创建局部变量,甚至不是全局变量,而是为i全局对象创建一个属性(它可能看起来/行为大多像一个全局变量 - 但它们有一些细微的区别)。

更好的是:

var i;
for(i=0; i<arr.length; i++) {
    var j=0;
    // ...
}

现在循环正在使用全局变量i(或函数局部变量i,如果此代码出现在函数中)

在 Javascript 中var 关键字变量与属性的作用是什么,了解更多相关信息

-- 请注意,有点令人困惑的是您可以重新声明一个变量,例如在第二个循环中

for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}


for(var i=0; i<9; i++){
    document.write('i = ' + i + '<br>');
}

这似乎是有效的(我测试时没有错误)。似乎您可以在 JavaScript 中重新声明变量 - 但它可能不是一个好主意,除非特殊情况 - 请参阅此相关问题,其中提到 [Google Analytics 如何使用变量的“安全”重新声明](重新声明一个 javascript 变量

i在这个相关的 SO 问题中,有一些关于在 JS 中重新声明变量(以及循环变量,如)的讨论:在循环内部或外部声明变量

有一个用于单个变量声明的 JavaScript 模式事件