【问题标题】:Are there any instances in which hoisting behavior is beneficial是否存在起吊行为有益的情况
【发布时间】:2013-08-26 14:45:45
【问题描述】:

我在与JavaScript 开发人员进行一些随意讨论时遇到了提升这个话题,我被告知提升不是错误、错误或编写不佳的功能,而是开发人员的强大工具.

谁能解释一下JavaScript 变量和函数的提升如何成为JavaScript 中的一个强大概念,或者它在编写代码时有何帮助? (或)它只是一个无意中被开发人员意外发现的概念吗?

【问题讨论】:

  • 它肯定不是“刚刚发现的”,它在 ECMA 规范中有很好的记录。假设您完全了解作用域和变量/函数声明提升的工作原理,这里有一个实用的应用程序:andrewkelley.me/post/js-callback-organization.html
  • 这个问题是否可以更好地表述为“是否存在提升行为有益的情况?”正如@FabrícioMatté 指出的那样,并不是有人“意外”实施了提升行为。从语言实现的角度来看,省略它会更简单。
  • @apsillers 感谢您的建议。
  • 这个可能被关闭为主要基于意见,因为讨论语言的各个方面通常倾向于遵循基于意见的路径(意识到在试图想象一个可能的答案时) ,但即使那样我也不会简历,这听起来像是一个有趣的问题。好吧,我的atm时间没了,稍后再回来查看。
  • 如果您有兴趣,在第 5 步(函数)和第 8 步(变量)中,EMCAScript 5 in section 10.5 指定了提升行为。

标签: javascript performance hoisting


【解决方案1】:

这是我最喜欢的关于提升和其他 JavaScript 范围问题/功能的文章,并且比我希望的更好地解释了这一切:

http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

编辑:

我错过了您实际上是在询问提升何时有用,而不仅仅是它的作用。

所以,既然您已经阅读了那篇文章并且知道它是做什么的,那么这里有一个使用提升的非常常见的 sn-p:

JS 文件:

var myVar = myVar || {};
myVar.foo = function(){};
//etc...

您会看到在许多 OOP JavaScript 文件的顶部使用它来声明对象。之所以能这样写,是因为 Javascript 中的提升。

如果没有提升,我们将不得不写

if(typeof myVar != 'undefined'){ var myVar = myVar; }别的{ var myVar = {}; }

或类似的东西。

另一个巧妙的吊装技巧如下:

var a, b = a = "A";

这相当于:

var a = "A";
var b = a;

另一个关于提升的好处发生在你编写函数时。

在没有提升的更传统的语言中,您需要在执行任何代码之前在页面顶部编写所有函数。否则会报函数不存在的错误。

通过提升,您的函数可以在任何地方声明(只要您使用var),它们将被提升到顶部,这意味着您不会收到这些错误。

现在,如果您正在编写自己的代码,那么无论如何您都应该在它们各自作用域的顶部声明变量,但是假设您有几个脚本文件要连接到一个中。吊装使这个过程变得更加简单。

【讨论】:

  • 这篇文章确实很好地解释了作用域和提升的工作原理,尽管问题似乎是“提升行为何时有益/有用”
  • 你是对的,我错过了那个标记......希望这个编辑有帮助。
  • var a, b = a = "A"; - 你为什么曾经使用这个?!
猜你喜欢
  • 2011-09-04
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2011-02-22
  • 2022-10-01
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多