首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript中的变量提升

javascript中的变量提升
EN

Stack Overflow用户
提问于 2015-06-01 13:42:13
回答 4查看 351关注 0票数 5

我在Variable Hoisting上读到了一些我无法确切理解如何学习的东西。我阅读了W3C学校的解释。但是,根据示例代码,我不能做什么是提升。

代码1这是w3c学校的代码

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

    <script>
    var x = 5; // Initialize x
    var y;     // Declare y

    elem = document.getElementById("demo"); // Find an element 
    elem.innerHTML = x + " " + y;           // Display x and y

    y = 7;     // Assign 7 to y

    </script>
       </body>
    </html>

但是上面的代码仍然显示变量'undefined'y

如果我按下面的方式更改代码,那么它可以正常工作。但是,下面的代码是通常的,而不是理解'hoisting'的不同代码。

代码语言:javascript
复制
<script>
var x = 5;  // Initialize x
var y;
y = 7;
elem = document.getElementById("demo"); // Find an element 
elem.innerHTML = x + " " + y;           // Display x and y
</script>

对此有什么帮助来理解“可变提升”吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-06-01 13:47:01

(注:在这个答案的末尾,我对at 2015的letconst作了简短的讨论。)

从根本上说,变量提升的意思是,无论您在任何给定的作用域中看到var,它都像是在作用域的最开始。所以这些都是完全相同的

代码语言:javascript
复制
function foo() {
    var a = 42;
}

function foo() {
    var a;
    a = 42;
}

function foo() {
    a = 42;
    var a;
}

function foo() {
    var a;
    a = 42;
    var a;
}

它们由JavaScript引擎处理,就好像它们是:

代码语言:javascript
复制
function foo() {
    var a;
    a = 42;
}

这里有一个实际使用变量提升的例子,并给出了一个我称之为http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html的例子(这是我贫血的小博客上的一篇文章)

代码语言:javascript
复制
function foo() {
    a = 42;
    b = 67;

    console.log(a); // 42
    console.log(b); // 67

    var a;
}
foo();
console.log(typeof a); // undefined
console.log(typeof b); // number?!
console.log(b);        // 67?!

为什么b存在于foo之外?因为在foo中,这两行做非常不同的事情:

代码语言:javascript
复制
a = 42;
b = 67;

第一行设置本地变量a,因为我们声明了它。是的,我们后来宣布了,但我们宣布了。

第二行创建一个隐式全局变量b,因为我们从未在foo中的任何地方声明过b

更多(在我的博客上)

  • var

ES2015 (又名"ES6")介绍了letconst。它们的处理方式与var略有不同

  1. 它们有块作用域,而不是函数或全局范围。
  2. 声明被悬挂到块的顶部,但在这一点上它们不会得到任何默认值;只有在代码逐步执行中到达声明时,它们才会被初始化(使用undefined或您提供的值)。

演示点1(块范围):

代码语言:javascript
复制
function foo() {
    {
        let a = 1;
        console.log(a); // 1
    }
    console.log(a); // ReferenceError: a is not defined
}
foo();

演示要点2:这将适用于var,但不适用于let

代码语言:javascript
复制
function foo() {
    a = 42; // ReferenceError: a is not defined
    let a;
}
foo();

从保留标识符(声明)到可以使用标识符(初始化)之间的时间称为不能使用变量的时态死区。

票数 6
EN

Stack Overflow用户

发布于 2016-07-01 04:10:15

Javascript引擎将分两个阶段执行代码

  1. 预处理阶段(或实例化阶段)。
  2. 执行阶段。

预处理阶段(或实例化阶段)-在预处理阶段,脚本将被扫描到所有声明。var -是声明变量的标识符。因此,当遇到var标识符时,变量将在全局范围中声明。变量的值是-未定义的

执行阶段-在执行阶段,脚本是逐行执行的.所有初始化都将在此阶段完成。

示例-1

对于下面的代码片段,在预处理阶段,Javascript引擎将逐行扫描代码,当它遇到"var a“行时,它将在全局范围内声明变量a。

在执行阶段,在"a=10“行中,变量'a‘将被初始化为值10。当它遇到控制台语句时,会打印值10。

代码语言:javascript
复制
a=10;
console.log(a); // 10
var a;
console.log(a); // 10

这是可变吊装的工作方式。

票数 3
EN

Stack Overflow用户

发布于 2015-06-01 13:49:08

在Javascript中,var x = 21;分为两部分:var x;x = 21;

var x;部件始终挂起至封闭function的开头。x = 21;部件留在原来的位置。

function () {}声明中也会发生同样的事情--这将被悬挂到封闭函数范围的顶部:

代码语言:javascript
复制
function pie () {
    return 21;
}

就像var一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30575151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档