吊装—注意

这是我关于“吊装”的注释,这是凯尔·辛普森(Kyle Simpson)撰写的《 您不知道Javascript:作用域和闭包 》的第四章。

在下面的示例中,我们可以看到“吊装”:

  a = 2; var = a; console.log(a); 

不熟悉JavaScript词法作用域的人们可能会期望此代码块中undefined ,因为似乎var = a重新定义a 。 但是,我们得到2

这是因为所有变量和函数声明都是在编译阶段进行的,而赋值是在执行阶段进行的。

JavaScript实际上是这样解释代码的:

  var = a; a = 2; console.log(a)// 2 

术语“吊装”源自我们将这些变量置于代码顶部的想法。

执行逻辑甚至函数表达式也都保留在原处。 例如,在var foo = function bar() { // do something.. }foo被吊起,而bar函数未被吊起。 它是在执行阶段分配的。

功能首先被提升。

吊装在每个范围内进行。

同一作用域中相同标识符的重复定义确实会造成混淆,尤其是在普通var和函数声明之间。 尝试不做。

您可以在这里看到为什么这是个坏主意:

  foo();  //“ b” var a = true; 
如果一个) {
函数foo(){console.log(“ a”); }
}
其他{
函数foo(){console.log(“ b”); }
}

这两个foo()声明都悬挂在foo()调用之上。 第二个foo()声明重写了第一个声明,因此b被打印到控制台。