问题标签 [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.

0 投票
1 回答
191 浏览

javascript - 为什么我的变量没有被提升?

我有一个i递增的全局变量(请参见此处的小提琴):

​在 Chrome 中,我收到错误消息Uncaught ReferenceError: i is not defined

变量不应该i在这里托管,以便在函数内部increment,变量i定义为undefined

0 投票
2 回答
308 浏览

javascript - 在javascript中提升

我之前问过一个问题,有人给了我一个指南,我读了它,我看到了这个

他说由于 JavaScript 提升,临时将是未定义的,我不明白为什么它不应该是这样的?

那么为什么它未定义?

0 投票
2 回答
147 浏览

javascript - JavaScript Internals 101:提升变量和函数

考虑以下示例:

萤火虫的输出是:

那么为什么f3在其他人工作正常的情况下提升给我错误呢?

0 投票
1 回答
93 浏览

javascript - JS新手,试图理解提升

可能重复:
重新声明 JavaScript 变量

我有下一段代码:

第二个alert(i)(在函数内部)产生undefined. 我猜这与 JS 引擎运行代码的方式有关 - 也许它在遍历代码之前没有先存储变量?

无论如何我认为这不是问题是JS,因为它支持提升。我可能弄错了 - 有人愿意解释吗?

谢谢!

0 投票
3 回答
226 浏览

javascript - 定义为函数调用参数的函数名称不会被提升。为什么不?

考虑以下代码。

请注意,a它似乎在定义之前已被访问。控制台输出是:(jsfiddle

函数和变量名称是在任何其他代码运行之前定义的,因此 console.log 调用在这里起作用。这称为吊装

但是如果函数被定义为函数调用中的参数,这不起作用。看看这段代码。

请注意,该函数b是在对a. 不是在闭包内部,而是在调用内部。控制台输出是:(jsfiddle

我想知道为什么会这样。这是预期的行为吗?这发生在 Chrome 和 Firefox 中。

更新:这个jsfiddle显示函数表达式中的名称在定义它们的范围内永远不可用。但是,名称是在函数本身的范围内定义的。这意味着命名函数表达式可以引用名称,但只能在函数内部。该名称也存储在函数的name参数中。

0 投票
3 回答
1169 浏览

javascript - Chrome 和 Firefox 中的 Javascript 提升

在 Chrome 和 Firefox 中运行它会给出不同的答案:

在 Chrome 中,结果为“否” 在 Firefox 中,结果为“是”

为什么有区别?

0 投票
4 回答
1734 浏览

c++ - 缓存 std::vector 的大小是否更快

我正在查看一个包含 std::vector 并存储向量大小的 C++ 类。每次修改向量时,该类都会更新此大小,从而导致大量冗余代码(因为始终可以从 size() 方法获得最新的大小)。这真的更快还是编译器会优化 size() 的迭代使用?

0 投票
2 回答
200 浏览

javascript - 在 JavaScript 中,当一个局部变量被提升时,它是否在声明之前就在范围内?

在JavaScript Ninja的秘密一书中,p。43 - 46,它有一些代码,如:

结论是,由于断言失败,“b 尚未在范围内,直到它被声明”。但我认为情况并非如此,因为首先,b可能已经有一个本地范围,但只是它还不是一个“数字”。 b实际上已经是一个局部作用域b,并且会影响任何全局作用域b

例如:

因为它打印出来了123,所以我们可以看到,当该行b = 456;执行时,b已经是一个本地范围b。(即使在分配之前它尚未初始化)。

此外,我们可以将其打印出来而不是分配给b

再一次,我们可以看到第一个打印输出 is not 123but is undefined,这意味着 theb是一个本地范围b,因此,b在本书的示例中,真的已经在范围内。

上述描述和概念是否正确?

0 投票
3 回答
11139 浏览

javascript - 为什么 JavaScript 会提升变量?

为什么 JavaScript 会提升变量?

当他们决定实施吊装时,设计师的基本原理是什么?还有其他流行的语言可以做到这一点吗?

请提供文件和/或记录的相关链接。

0 投票
1 回答
772 浏览

javascript - 为什么 catch 子句有自己的词法环境?

考虑以下来自 ECMA-262 v5.1的摘录(我最近在这个问题中看到):

词法环境是一种规范类型,用于根据 ECMAScript 代码的词法嵌套结构定义标识符与特定变量和函数的关联。一个词法环境由一个环境记录和一个对外部词法环境的可能为空的引用组成。通常,词法环境与 ECMAScript 代码的某些特定句法结构相关联,例如 FunctionDeclaration、WithStatement 或 TryStatement 的 Catch 子句,并且每次评估此类代码时都会创建一个新的词法环境。

我认为这意味着catch子句的主体会像函数一样提升自己的变量,但显然情况并非如此

有人知道为什么吗?另外,为什么一个catch子句需要它自己的词法环境?