var声明语法很奇怪,但可以正常工作
Weird but working var declaration syntax
我经常使用这种语法,但我不明白为什么它只是工作。
var a = 1, b = a + 1;
console.log(b); // 2
如果你声明一个变量,在逗号上分开它们后,b
已经看到a
被评估了吗?为什么呢?
已经这样定义了。
首先,基本术语的定义:
VariableStatement :
var
VariableDeclarationList;
:
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList, VariableDeclaration
适用于你的问题的实际定义是:
生成VariableDeclarationList:VariableDeclarationList, VariableDeclaration按如下方式求值:
<
- <
评估em> VariableDeclarationList 。
评估em> VariableDeclaration 。
所以在#2执行的时候,#1已经被求值了你可以在#2中使用它的任何效果
这是由于JavaScript中变量的声明方式。Javascript中的变量声明分两步进行。首先,在当前范围内声明的所有变量都被初始化,并被赋予未定义的值,在以这种方式声明所有变量之后,它们被赋予实际值。所以你的代码:
var a = 1, b = a + 1;
被翻译成:
var a = undefined;
var b = undefined;
a = 1;
b = a + 1;
这叫做提升。因为您声明的所有变量都在作用域的顶部被提升。这允许你做一些奇怪的事情,比如:
var a = b; // b = undefined
var b = 0;
因为a在b之前被初始化,这个过程从左到右进行
这有点违反直觉,但只要把它想象成等于这个:
var a = 1;
var b = a + 1;
不像其他语言,如Python,多个赋值操作前一个值(使交换更容易)
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 正在尝试使用if和else添加类,但无法正常工作
- Jquery FadeIn FadeOut 只工作一次
- Foreach无法在Typescript中工作
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- JS可以在Chrome中工作,但不能在Firefox中工作
- ajaxToolkit PopupControlExtender不工作.过时的
- HTML标记在脚本标记中工作
- javascript扫雷器floodfill算法不能正常工作