JavaScript中的var

JavaScript中的var,javascript,Javascript,考虑JavaScript中的以下代码- var DEFAULT_RATE=0.01; var rate=0.04; function getRate() { if(!rate) { var rate=DEFAULT_RATE; } return rate; } console.log(`Rate is`,getRate()); 以下代码的输出为0.01 我的收获是,VAR被提升(并声明为未定义)到与其使用位置相关的范围的顶部。在let和const的情况下,它们进入TDZ,

考虑JavaScript中的以下代码-

var DEFAULT_RATE=0.01;
var rate=0.04;
function getRate() {
  if(!rate) {
    var rate=DEFAULT_RATE;
  }
  return rate;
}
console.log(`Rate is`,getRate());

以下代码的输出为0.01 我的收获是,VAR被提升(并声明为未定义)到与其使用位置相关的范围的顶部。在let和const的情况下,它们进入TDZ,但这完全是另一回事

但我也了解到var具有全球范围。然后var show不允许变量重新声明


全局范围不是指包含整个代码的范围吗?我理解错了吗?

当使用
var
声明变量时,变量可以具有函数或全局范围。如果
var
在函数内使用,则该变量具有函数作用域;如果
var
在任何函数外使用,则该变量具有全局作用域

因此,你的声明:

但我也了解到var具有全球范围。那么var show是不允许的 变量重新声明

实际上并不准确,因为它取决于
var
的使用位置,并且在比第一次声明更小的范围内可以进行重新声明(更准确地称为变量“隐藏”)

当使用
var
进行声明时,该声明将被提升到范围的顶部


在JavaScript中,函数声明在var声明之前被提升,而赋值则不被提升

下面是问题中的示例代码:

var违约率=0.01;
风险值率=0.04;
函数getRate(){
如果(!费率){
var率=违约率;
}
回报率;
}
具有以下有效顺序:

//提升功能
函数getRate(){

var rate=undefined;//请注意,
var
本质上是一种遗留语法,对于您编写的任何新代码,您都希望使用
let
const
,因为它们是块范围的,没有
var
所遭受的奇怪范围限制。既然如此,您能解释一下您的外卖基于什么吗?
>var
是函数作用域(因此变量声明在解析时被提升到函数的顶部,而将初始化保留在它找到它的地方。如果这使它隐藏现有的var,那就太糟糕了)除非在全局范围内声明,否则在这种情况下会发生相同的事情,但是全局的。这回答了您的问题吗?这是一个丑陋的提升问题,由if块内部的
var-rate=DEFAULT\u-rate
引起,与
function getRate(){var-rate;if(!rate){rate=DEFAULT\u-rate;}返回率;}
getRate
将始终返回
DEFAULT\u RATE
,因为
getRate
中的if语句将始终为true。这不是
if(!RATE)的原因
是真的。@deceze感谢您指出我没有注意到
getRate
中的
var-rate
声明。答案已更正。