Javascript变量初始化和声明顺序

标签 javascript

使用 typescript ,我发现当我使用数组解构时,它会生成一些不寻常的代码,其中变量初始化先于其声明,即在下面的示例中控制台显示“未定义”

(function () {
    var _a = 1;
    _c = _a;
    var _c;
})();
console.log(_c);

> ReferenceError: _c is not defined

为什么变量_c没有成为全局变量?

最佳答案

在 Javascript 中,所有变量声明都会在任何代码实际运行之前提升到声明它们的作用域的顶部。所以你的代码示例:

(function () {
    var _a = 1;
    _c = _a;
    var _c;
})();
console.log(_c);

评估如下:

(function () {
    var _a;
    var _c;
    _a = 1;
    _c = _a;
})();
console.log(_c);

因此,_c 在实际引用或使用之前在本地声明,因此它不是隐式全局变量,因为它是在引用它的范围内声明的,并且提升确保它被声明在该作用域的开头,无论 var _c; 声明位于作用域内的哪个位置。

<小时/>

以下是有关提升概念的一些引用:

JavaScript Scoping and Hoisting

MDN - var statement

Demystifying JavaScript Variable Scope and Hoisting

JavaScript Hoisting Explained

关于Javascript变量初始化和声明顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30210812/

相关文章:

javascript - 在 NodeJS 中,如何从虚拟函数中退出父函数

javascript - Fabricjs 克隆 Canvas 从矩形中删除小数

javascript - 重复向 div 元素添加文本

javascript - 获取 "Uncaught TypeError: $(...).dialog is not a function"

javascript - 使用 WebSocket 发送位

javascript - 使用 javascript 在 github 页面上写入文件

javascript - 为什么 socketIO 调用太多连接?

javascript - 如何在 JavaScript 中读取 HTTP GET 变量?

arrays - 将数组从 ActiveX 组件返回到 JavaScript

javascript - Angular 2 在箭头函数中更新 var - Facebook