在if块中声明javascript变量并在块外使用它可以吗?

在if块中声明javascript变量并在块外使用它可以吗?,javascript,Javascript,我会用大多数语言写作 declare var1 = undefined if (condition) { var1 = value1 } 但在javascript中,它似乎是被允许写的 if (condition) { let var1 = value1 } else { var1 = value2 } 我在这个问题上被误导了吗?是的,当你使用var时,你可以 当您使用let和const时,它们不是块作用域 风险值示例 if(真){ var1=1 } console.log(va

我会用大多数语言写作

declare var1 = undefined
if (condition) {
 var1 = value1
}
但在javascript中,它似乎是被允许写的

if (condition) {
  let var1 = value1
} else {
  var1 = value2
}

我在这个问题上被误导了吗?

是的,当你使用var时,你可以

当您使用
let
const
时,它们不是块作用域

风险值示例

if(真){
var1=1
}

console.log(var1)在JavaScript中,变量可以在使用后声明。 换句话说:变量可以在声明之前使用。 提升是JavaScript将所有声明移动到当前作用域顶部(当前脚本或当前函数顶部)的默认行为

因此:

将翻译为:

var x;    
x = 5
// ... some other code
但只有当您使用
var
声明变量时,它才会以这种方式工作。如果使用
const
let
它将不起作用,因为使用
let
const
声明的变量和常量不会被提升


使用
let
const
声明变量是现代javascript的一种方式。

不,这完全是个坏主意。如果要在If语句内部和外部使用JavaScript变量,可以在If语句外部声明它

let var1 = value1;
if (condition) {
  var1 = value1
} else {
  var1 = value2
}
这样,您将只创建一个块范围的变量。但是,如果您使用
var var1=value1
,那么它将声明全局范围的变量,这可能不是您最想要的。
要了解更多关于javascript中变量如何工作的信息,您可以签出这篇文章。快乐编码:)

您可以使用
let
来实现这一点,但不能使用严格模式

'use strict';
var condition = false;

if (condition) {
  let var1 = 42;
  console.log(var1);
} else {
  var1 = 43;
  console.log(var1);
}
// ReferenceError: var1 is not defined
建议将
var1
声明在
if
语句的范围之外:

'use strict';
var condition = false;
var var1 = 42;

if (condition) {
  console.log(var1);
} else {
  var1 = 43;
  console.log(var1);
}
// => 43

如果您使用
let
,则似乎允许写入
不允许-它具有块作用域(以及
const
。您确定您没有想到
var
?),我建议您只声明变量,而不在所有条件之前设置它(即,“let var;”),并在需要时设置它。还有一行代码,但在我看来没有问题,可读性更好。正如我从凯尔·辛普森(Kyle Simpson)的书《YDKJS》等许多参考资料中了解到的那样:“程序员应该优先使用var,let,cost,特别是按照这个顺序。let不是新的var,在整个代码范围内都需要变量的地方,我们仍然必须使用var。”@莎士比亚很好,你可以在最外层范围内定义
let
。当然,我们可以在最外层范围内定义let,但仍然。。。我认为let在for循环等方面非常出色,但我们并不总是需要将var替换为let关键字作为一种新习惯。
'use strict';
var condition = false;
var var1 = 42;

if (condition) {
  console.log(var1);
} else {
  var1 = 43;
  console.log(var1);
}
// => 43