吊装的主要优点是什么?

时间:2019-05-21 07:06:49

标签: javascript

几天前,我接受了一次采访,其中一个问题是“什么是吊装?”,然后我完全解释了吊装的概念,然后面试官问我“吊装的主要优点是什么?”我无法回答。 真的,使用javascript进行吊装的主要优势是什么?

4 个答案:

答案 0 :(得分:1)

方便吗?

不是。这很方便。两者都以代码本身作为读者的编码者。对于可变吊装,不是很多,但是对于功能吊装。这样,您可以将帮助程序功能放在代码的底部,而将更抽象的帮助程序功能放在顶部的业务逻辑中。

我喜欢关于同一个主题https://www.quora.com/Why-does-JavaScript-hoist-variables的定额答案

  

换句话说,发生的事情是JavaScript实现了函数声明的提升,因此程序员不必被迫将最里面的函数放在脚本块的顶部,而将最外面的(顶层)函数放在脚本块的顶部在底部。在ML语言(例如LISP)中强制执行此命令很痛苦,因为程序员更喜欢从上至下而不是从上至下阅读代码。像C / C ++这样的语言可以通过使用标头文件和独立的声明来解决此问题,而JavaScript则没有。另外,实现相互递归需要吊装。

答案 1 :(得分:0)

名称(变量名称,函数名称)的作用域是其块。 var是函数主体,let / const是最接近的{}块。由于Javascript中可能存在嵌套作用域,因此必须清楚变量属于哪个块。如果您在特定中的任意位置提到var foo / let foo ,则该块将保留为该变量的作用域。

function () {
/**** scope of foo *****/
/*/
/*/ var foo;
/*/
/*/ function () {
/*/ /** scope of bar **/
/*/ /*/
/*/ /*/ var bar;
/*/ /*/
/*/ /******************/
/*/ }
/**********************/
}

如果变量范围仅在声明var ...的确切 line 处开始,那将非常令人困惑。那么该函数的一半将具有一个变量范围,另一半将具有另一个变量范围。因此,如果var / let在一个块中的任意位置存在,则该名称将被包含整个块。

答案 2 :(得分:0)

好吧,任何事物都有其优点和缺点,但在这种情况下,缺点似乎大于优点。

在我看来,提升使代码更难推理。但那只是我的个人意见。当我编写代码时,我希望在我声明它们的代码中声明我的绑定。这样,例如,如果我在声明它们之前错误地使用它们,我就会得到通知。而且我当然不想意外地将它们声明两次,这将是完全有效且完全令人困惑的。

当我做一些愚蠢的事情时,我希望编译器/解释器帮助我。提升让我可以做太多方便和/或愚蠢的事情,可能会导致数小时的复杂调试会话。所以从 ES6 开始,我主要使用 letconst 而不是 var。如果我能帮上忙,我就不用吊了。 ;)

所以我对“提升的(主要)优势是什么?”这个问题的回答会是:“我真的不在乎。”

编辑:

好吧,也许我在这里有点太苛刻了。函数提升实际上可能有用且方便,并提高代码的可读性。但是在函数内部,我会尽量避免变量提升。

答案 3 :(得分:-2)

在某些情况下,起吊可能很有用。例如,我们正在创建一个大项目。它具有大量的帮助程序方法,然后将其放入另一个脚本中。现在,如果使用函数声明来声明它们,则不必担心脚本的顺序。否则我们可能会遇到问题。

另一种用法是当我们使用递归时。考虑使用递归打印数字的功能。

(function print(n){
  if(n === 0) return;
  console.log(n)
  print(n-1)
})(4);

现在,如果没有任何悬挂,代码可能会抛出未定义打印的错误