Javascript 使用相同名称的var和let变量? 自从发布以来,它允许我遵循更严格的命名约定。但是,让我们考虑下面的场景,它是有效的还是不可行的?我非常清楚,第一个具有功能范围,另一个具有块范围 var sample = 'sample'; function fooBar() { let sample = 'This is a sample'; console.log(sample); } fooBar(); console.log(sample)

Javascript 使用相同名称的var和let变量? 自从发布以来,它允许我遵循更严格的命名约定。但是,让我们考虑下面的场景,它是有效的还是不可行的?我非常清楚,第一个具有功能范围,另一个具有块范围 var sample = 'sample'; function fooBar() { let sample = 'This is a sample'; console.log(sample); } fooBar(); console.log(sample),javascript,Javascript,这是有效的 由于一个声明在函数外部,另一个在函数内部,您甚至可以使用var声明这两个声明: var-sample='sample'; 函数fooBar(){ var sample='这是一个样本'; console.log(示例);//“这是一个示例” } fooBar(); console.log(示例);/'示例“您在此处尝试执行的操作完全有效,称为阴影。顾名思义,您已经使用函数作用域变量sample对全局作用域变量sample进行了阴影处理。通过这样做,您可以限制自己访问全局变量,而无需

这是有效的

由于一个声明在函数外部,另一个在函数内部,您甚至可以使用
var
声明这两个声明:

var-sample='sample';
函数fooBar(){
var sample='这是一个样本';
console.log(示例);//“这是一个示例”
}
fooBar();

console.log(示例);/'示例“
您在此处尝试执行的操作完全有效,称为阴影。顾名思义,您已经使用函数作用域变量sample对全局作用域变量sample进行了阴影处理。通过这样做,您可以限制自己访问全局变量,而无需使用一些特殊技巧。 您仍然可以访问函数中同名的全局变量,如下所示

var sample = 'sample';
function fooBar() {
  var sample = 'This is a sample';
  console.log(sample); // 'This is a sample'
  console.log(window.sample); //Sample
  //console.log(this.sample);//Sample. Works only in non strict mode
}
fooBar();
console.log(sample); // 'sample'
此外,如果有人说永远不要使用var,那么这个说法就有点太难了。var仍然有它的用途。你可以在这里看看凯尔·辛普森的这篇文章

希望这能有所帮助

快乐学习:)
Vatsal

当然它是有效的,就像用
var
声明的一样。隐藏globals是个好主意吗?几乎可以肯定不是。在这种情况下,它们都有函数作用域。这不是黑客行为,这是毫无意义的。1:不要使用全局状态。2:使用有意义的名称。3:不要再使用
var
。@Amit-我对#3很好奇。我想我不同意第三点。我编码时从不使用全局变量。这是一个例子……因此名称当然没有意义。@Asperger当有
const
let
时,没有理由使用
var
。他们更善于沟通,不易受到
var
问题的影响。访问父函数中的变量怎么样。我实际上没有嵌套函数,但我只是好奇。如果它不是窗口的一部分,而是另一个函数/对象的一部分,我会这样称呼它:fn.sample?您可以访问当前函数范围内的变量或全局窗口范围内的变量。您无法访问父函数的变量。范围查找始终从最内部的函数开始,并在找到变量后立即停止。您只能使用window对象访问全局变量,但无法查找/访问非全局阴影变量我读了David Walsh的那篇博文,对其中的参数完全没有印象。