在Javascript中,我可以在声明变量之前使用它吗

In Javascript, can I use a variable before it is declared?

本文关键字:变量 Javascript 我可以 声明      更新时间:2023-10-28

我一直在想,在定义变量之前,是否可以在JS中使用它,例如以下内容:

var country = "USA";
switch (country) {
    case "USA":
        country = i;
    case "blach":
        //not finished yet
}
/*
  put a whole
  bunch more code here
*/
var i = 10;

这个有效吗?允许吗?如果是的话,它的技术术语是什么?

这是JavaScript引擎使用的一种技术,名为提升。解析器将在运行整个函数之前读取它,并且任何变量声明(即使用var关键字)都将被执行,就像它们位于包含范围的顶部一样。因此,您的代码表现为:

var country;
var i;
country = "USA";
switch (country) {
case "USA":
    country = i;
case "blach":
    //not finished yet
}
i = 10;

因此,在整个作用域中,i声明为,但在i = 10语句运行之前,其值为undefined

在ECMAScript术语中,当调用函数时,函数的新词法作用域会在函数的任何代码运行之前构建其VariableEnvironment。在ECMAScript 10.5中,步骤8:

8.对于每个变量声明d代码中,按源文本顺序执行

a。设dn为d.中的标识符

i。调用env的CreateMutableBinding具体方法,将dnconfigableBindings作为参数。

ii。调用env的SetMutableBinding具体方法,将dnundefinedstrict作为参数。

这很有意思,但基本上说:

在运行函数之前,请查看函数的源代码中的var [identifierName]等声明。

对于找到的每个声明,在函数的作用域中使用声明中使用的名称[identifierName]创建一个新变量,然后将其值设置为undefined

它被称为可变提升,这是一个很好的概念,因为它偶尔会创建难以跟踪的错误

例如:

var stuff = 'stuff';
function() {
 console.log(stuff); //outputs 'undefined'
 var stuff = 'other stuff';
 console.log(stuff); //outputs 'other stuff'
}

第一个console.log输出undefined,因为函数中的var stuff提升到函数顶部。

//theoretical compiled output
var stuff = 'stuff';
function() {
 var stuff; //has not been defined
 console.log(stuff);
 stuff = 'other stuff'; //defined here
 console.log(stuff);
}

如果不了解可变起重,这个结果可能会令人困惑。

因此,如果您查看专业开发的JavaScript代码,通常会看到函数中的所有变量都在顶部声明。

是。在JavaScript中,变量被提升

变量语句声明按照10.5中的定义创建的变量变量在创建时初始化为未定义。带有Initializer的变量在执行VariableStatement时被分配其AssignmentExpression的值,而不是在创建变量时ES5§12.2
其中10.5步骤8是感兴趣的部分

这些家伙的答案是正确的。然而,对于您的示例,值得注意的是countryundefined。正如aspillers所提到的,您的代码的行为如下

var country;
var i;
country = "USA";
switch (country) {
case "USA":
    country = i;
case "blach":
    //not finished yet
}
i = 10;
alert(country) //undefined;

但是当您的case语句为"USA"运行时,i是未定义的,因此它被分配给country。试试这把小提琴。

我想您只需要注意,尽管变量声明是挂起的,但值赋值不是。

是的,您可以在声明变量之前使用它。它在JavaScript中被称为提升。但需要记住的一点是,只有变量的声明被提升,而不是它的初始化。这意味着您将无法使用稍后在代码中分配的变量的值。例如,

console.log(myVar); //undefined
myVar = 10;
var myVar;

因此,即使在声明之前使用myVar,也不会得到错误(myVar未定义)。但是myVar的控制台日志值将是未定义的。在代码执行开始时,变量已声明,但其赋值未声明。因此JS引擎会将上面的代码块视为

var myVar;
console.log(myVar); //undefined
myVar = 10;
var myVar;

它将把文件中使用的所有变量的声明放在代码的顶部。