问题标签 [hoisting]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 为什么返回后变量提升在某些浏览器上有效,而在某些浏览器上无效?
上面的代码在 IE、FF 和 Opera 中抛出错误,指出函数中必须有 return 语句。但它undefined
在 Safari 和 Chrome 中有效(显示)。
上面的代码是在全局范围内编写的。在所有功能之外。
任何原因?
javascript - 浏览器中的单个网页执行多少个 JavaScript 程序?
JavaScript 程序由语句和函数声明组成。执行 JavaScript 程序时,会发生以下两个步骤:
扫描代码以查找函数声明和每个函数。声明被“执行”(通过创建函数对象)并创建对该函数的命名引用(以便可以从语句中调用该函数)
语句按顺序执行(评估)(如代码中所示)
正因为如此,这工作得很好:
尽管“foo”函数在声明之前被调用,但它之所以有效,是因为函数声明是在语句之前评估的。
但是,这不起作用:
将抛出 ReferenceError(“未定义 foo”)。这导致了这样的结论:网页的 HTML 代码中的每个 SCRIPT 元素都代表一个单独的 JavaScript 程序,并且每次 HTML 解析器遇到一个 SCRIPT 元素时,它都会执行该元素内的程序(然后一旦程序被执行,解析器转到 SCRIPT 元素后面的 HTML 代码)。
再说一次,这确实有效:
我在这里的理解是全局对象(作为全局执行上下文中的变量对象)一直存在(并且仍然存在),所以第一个 JavaScript 程序会创建函数对象并为它做一个引用,然后第二个 JavaScript 程序将使用该引用来调用该函数。因此,所有 JavaScript 程序(在单个网页内)“使用”同一个 Global 对象,并且一个 JavaScript 程序对 Global 对象所做的所有更改都可以被随后运行的所有 JavaScript 程序观察到。
现在,请注意这...
在上述情况下,警报调用不会执行,因为“foo()”语句会引发 ReferenceError(这会破坏整个 JavaScript 程序),因此所有后续语句都不会执行。
然而,在这种情况下...
现在,警报调用确实被执行了。第一个 JavaScript 程序抛出一个 ReferenceError(并因此中断),但第二个 JavaScript 程序正常运行。当然,浏览器会报错(虽然它确实执行了后续的 JavaScript 程序,但在发生错误之后)。
现在,我的结论是:
- 网页 HTML 代码中的每个 SCRIPT 元素都代表一个单独的 JavaScript 程序。这些程序在 HTML 解析器遇到它们时立即执行。
- 同一个网页中的所有 JavaScript 程序都“使用”同一个 Global 对象。该 Global 对象始终存在(从获取网页的那一刻起直到网页被销毁)。JavaScript 程序可以操作 Global 对象,一个 JavaScript 程序对 Global 对象所做的所有更改都可以在所有后续 JavaScript 程序中观察到。
- 如果一个 JavaScript 程序中断(通过抛出错误),这不会阻止后续 JavaScript 程序执行。
请事实检查这篇文章,如果我有什么问题,请告诉我。
另外,我还没有找到解释这篇文章中提到的行为的资源,我认为浏览器制造商一定在某个地方发布了这些资源,所以如果你知道它们,请提供它们的链接。
javascript - 不同文件之间的吊装
有没有办法在不同文件中的源代码之间进行函数和变量提升?也就是说,像
和
我想这是不可能的,因为大多数javascript引擎分别按顺序解析和执行不同的文件,但我不确定。
我不知道这是否在 ECMA 的规范中,因为不同文件的解析并不是语言的一部分。
javascript - 为什么注释掉此代码的 alert() 行会使其失败?
我对javascript有一个非常奇怪的问题。如果您使用以下代码并运行它,它将运行良好而没有任何错误,但如果您注释第一个alert
,它将在第 5 行 ( var _board = Bomber.BoardFactory.getBoard();
) 抛出错误,说 BoardFactory 不存在(请记住,第一个警报一切都是运行没有错误)。我已经能够使用 Firefox 和 Chrome 重现这种确切的行为。
我的问题是什么可能导致这种奇怪的行为?一个警报呼叫到底怎么可能使它识别出Bomber.BoardFactory
?
clojure - 绕过clojure中缺乏“提升”的问题
有几次我发现我有一组相互关联的函数,而我如何自然地将它们放在文件中最终会与它们的依赖项发生冲突(即函数 1 依赖于函数 2,但在函数 1 之上)。当我编写代码时,我通常会继续评估顶级表达式,并且只会评估整个文件以刷新对 refs 或诸如此类的依赖关系。我经常发现,我最终会遇到依赖冲突,最终不得不处理一堆函数。
在我知道的其他语言中,一旦你声明了一个函数,它就会在幕后“提升”,就好像它出现在其他任何东西之前一样。这样您就不必担心代码中事物的顺序,并且可以将函数视为代码的模块化位。正是缺少这个功能让我一直在 clojure 中苦苦挣扎。难道我做错了什么?与其说是一件大事,不如说是一件小事,这是你习惯于关注的事情吗?
javascript - 函数表达式本身不能将名称分配给另一个值
在下面的代码中:
printTest 将显示“函数”而不是“未定义”,这是有道理的,因为根据我的理解,任何变量声明总是被“提升”到执行上下文的顶部(在这种情况下是函数执行上下文)这使得函数声明“test()” 是稍后出现在当前执行上下文中的那个。现在考虑这段代码,我实际上为 var 声明“var test =1”分配了一个值。
然后 printTest 现在显示“数字”,这意味着执行上下文现在保持不同的顺序。有人可以解释这里实际发生了什么吗?
javascript - 理解 JavaScript 提升和真假
我一直在阅读有关 JavaScript 提升的文章。
JavaScript 范围界定和提升,作者 Ben Cherry
关于“提升”的两个词,作者:Dmitry Soshnikov
还有更多关于 JavaScript 类型强制、真假测试的信息: Truth、Equality 和 JavaScript以及其他一些资源
在练习一些时,发现我错过了一些关于提升和变量“真假”的重要概念。
1:带有重复变量声明的“if”真值测试
o/p:inside if
怀疑: 'foo' 值为 '1',if(!foo)
应该评估为false
并且该块不应该被执行(引用上面的资源:提升只影响var
&function
声明,但不影响执行)。但是为什么会显示该警报。如果我直接使用,情况并非如此false
(如下面的无技巧代码所示:片段#3)
2:没有重复变量声明的“if”真值测试
o/p:无输出;表示控制未进入“if”块
这是人们可以期待的
3: 'if' 使用 'false' 重复变量声明
o/p:无输出;表示控制未进入“if”块
这是人们可以期待的
有人请澄清。谢谢
javascript - 在命名空间中设置标准 JavaScript 原型继承?
JavaScript 中的标准原型继承如下:
Bird的函数定义是否必须在Bird的原型和构造函数的赋值之后。我问这个是因为我试图从命名空间中执行此操作,而变量提升导致我的代码失败。举个例子:
由于提升了 namespace.Bird.prototype 赋值语句和 namespace.Bird.prototype.constructor 赋值语句失败。但是,如果我将 namespace.Bird 函数分配移动到这两行之上,如以下代码块所示,则代码似乎可以工作。
但是,我不知道是否有特定原因导致大多数资源显示原始顺序而不是首先进行功能分配。
有人可以澄清一下吗?
谢谢!
javascript - Javascript函数作用域和提升
我刚刚阅读了Ben Cherry 撰写的一篇关于 JavaScript 作用域和提升的精彩文章,他在其中给出了以下示例:
使用上面的代码,浏览器会提示“1”。
我仍然不确定为什么它返回“1”。他说的一些事情让我想起了:所有的函数声明都被提升到了顶部。您可以使用函数作用域变量。仍然没有为我点击。
javascript - 试图完全理解 JavaScript 提升
编辑 看起来这是我的一个问题,我对 jsfiddle 的使用:?
最近看了几篇关于吊装的文章,一篇是Nicholas Zakas的,另一篇是Ben Cherry 的。
我试图按照这些示例进行测试,以确保我完全掌握它,但我主要遇到这个示例的问题,
而不是记录undefined
其 logging 1
。如果我正确理解所有内容,a
应该是undefined
,因为它应该存在于窗口范围内,因为 var 语句被提升到顶部,所以它不应该被赋值。
但以下是按预期行事,
foo
是undefined
,并且baz
没有定义。我对这两个例子都很感兴趣。真的只是想解决这个问题。自从写了这些文章以来,有什么变化吗?如果有人能对此有所了解,将不胜感激。我在测试时使用 Chrome 14。