在Javascript中,我可以在声明变量之前使用它吗
In Javascript, can I use a variable before it is declared?
我一直在想,在定义变量之前,是否可以在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具体方法,将dn和configableBindings作为参数。
ii。调用env的SetMutableBinding具体方法,将dn、
undefined
和strict作为参数。
这很有意思,但基本上说:
在运行函数之前,请查看函数的源代码中的
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是感兴趣的部分
这些家伙的答案是正确的。然而,对于您的示例,值得注意的是country
是undefined
。正如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;
它将把文件中使用的所有变量的声明放在代码的顶部。
- 调用类向后变量 (JavaScript)
- 初始化父类中的变量(JavaScript/CoffeeScript 习语)
- 可以'找不到变量javascript错误
- 输出数组变量javascript
- 自提交表单访问变量javascript
- 将变量 javascript 添加到用于旋转图像的链接中
- 在文本字段中显示保存的本地存储变量 - javascript
- 将变量添加到变量 JavaScript 中
- 获取要在变量 JavaScript 中使用的用户输入值
- 如何在变量 Javascript 中删除双引号
- 使用变量 javascript 从 json 文件中获取数据
- 读取输入和打印变量 - JavaScript 和 HTML 4.01
- 传递 PHP 变量 JavaScript 窗口位置
- 重置变量 JavaScript
- 变量 JavaScript 中的变量
- 尝试使用多个函数时无法使用全局变量 - JavaScript - 初学者
- 如何按值将数组分配给另一个变量 JavaScript
- setTimout 搞砸了变量 JavaScript
- 用内部函数变量更改外部函数变量?Javascript
- 根据变量 JavaScript 增加