我在Variable Hoisting上读到了一些我无法确切理解如何学习的东西。我阅读了W3C学校的解释。但是,根据示例代码,我不能做什么是提升。
代码1这是w3c学校的代码
<!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'的不同代码。
<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>对此有什么帮助来理解“可变提升”吗?
发布于 2015-06-01 13:47:01
(注:在这个答案的末尾,我对at 2015的let和const作了简短的讨论。)
从根本上说,变量提升的意思是,无论您在任何给定的作用域中看到var,它都像是在作用域的最开始。所以这些都是完全相同的
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引擎处理,就好像它们是:
function foo() {
var a;
a = 42;
}这里有一个实际使用变量提升的例子,并给出了一个我称之为http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html的例子(这是我贫血的小博客上的一篇文章)
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中,这两行做非常不同的事情:
a = 42;
b = 67;第一行设置本地变量a,因为我们声明了它。是的,我们后来宣布了,但我们宣布了。
第二行创建一个隐式全局变量b,因为我们从未在foo中的任何地方声明过b。
更多(在我的博客上)
varES2015 (又名"ES6")介绍了let和const。它们的处理方式与var略有不同
undefined或您提供的值)。演示点1(块范围):
function foo() {
{
let a = 1;
console.log(a); // 1
}
console.log(a); // ReferenceError: a is not defined
}
foo();演示要点2:这将适用于var,但不适用于let
function foo() {
a = 42; // ReferenceError: a is not defined
let a;
}
foo();从保留标识符(声明)到可以使用标识符(初始化)之间的时间称为不能使用变量的时态死区。
发布于 2016-07-01 04:10:15
Javascript引擎将分两个阶段执行代码
预处理阶段(或实例化阶段)-在预处理阶段,脚本将被扫描到所有声明。var -是声明变量的标识符。因此,当遇到var标识符时,变量将在全局范围中声明。变量的值是-未定义的。
执行阶段-在执行阶段,脚本是逐行执行的.所有初始化都将在此阶段完成。
示例-1
对于下面的代码片段,在预处理阶段,Javascript引擎将逐行扫描代码,当它遇到"var a“行时,它将在全局范围内声明变量a。
在执行阶段,在"a=10“行中,变量'a‘将被初始化为值10。当它遇到控制台语句时,会打印值10。
a=10;
console.log(a); // 10
var a;
console.log(a); // 10
这是可变吊装的工作方式。
发布于 2015-06-01 13:49:08
在Javascript中,var x = 21;分为两部分:var x;和x = 21;。
var x;部件始终挂起至封闭function的开头。x = 21;部件留在原来的位置。
在function () {}声明中也会发生同样的事情--这将被悬挂到封闭函数范围的顶部:
function pie () {
return 21;
}就像var一样。
https://stackoverflow.com/questions/30575151
复制相似问题