JS中用var和let声明变量的异同
When you declare a variable with the var keyword, it is declared globally, or locally if declared inside a function.
当使用var关键字声明变量时,它是全局声明的(在循环语句中声明也是全局的),如果在函数内部声明,则是局部声明的。
The let
keyword behaves similarly, but with some extra features. When you declare a variable with the let
keyword inside a block, statement, or expression, its scope is limited to that block, statement, or expression.
let关键字的行为类似,但有一些额外的功能。在块、语句或表达式中使用let关键字声明变量时,其作用域仅限于该块、语句和表达式。
PS: 另外,let和const都会检查有无重复变量名,若当前定义的变量名已经存在,则报错提示,方便纠察代码。而var没有此功能。
for (var i = 0; i < 3; i++) {
}
相当于
var i;
for (i = 0; i < 3; i++) {
}
for循环里var i变量的值会变成最新更新的值,即i将始终引用更新的全局i变量的值,返回
全局i,而不是在当前当次for循环中创建函数时i的值。如:
var printNumTwo;
for (var i = 0; i < 3; i++) {
if (i === 2) {
printNumTwo = function() {
return i;
};
}
}
console.log(printNumTwo()); //3
console.log(i); //3 因为var是全局声明的,故这里出了for循环也能取到i的值。
这里得出的是3而不是2,这是错误的。这是因为分配给i的值已更新,printNumTwo()返回全局i,而不是在for循环中创建函数时的值。
用let关键字定义变量则不会如此,以上例子将var修改为let即可得到正确值:
var printNumTwo;
for (let i = 0; i < 3; i++) {
if (i === 2) {
printNumTwo = function() {
return i;
};
}
}
console.log(printNumTwo()); //2
console.log(i); //报错:ReferenceError:i is not defined. let声明会报此错!因为超出了范围。
对于错误“ReferenceError: i is not defined”,报此错是因为这里用let声明i,故i不是在全局范围中声明的,它仅在for循环语句中声明。
printNumTwo()返回了正确的值,因为循环语句中的let关键字创建了三个具有唯一值(0、1和2)的不同的i变量!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义