hoisting 相关问题

提升意味着函数范围内的局部变量被视为在函数评估开始时声明它们,而不管它们实际声明的位置。

通过递归方法调用和 || 索引跳出 for 循环JavaScript 中的运算符

我正在使用 Javascript 中的树状结构,我发现 Javascript 的 for 循环以意想不到的方式工作。让我描述一下: c...</desc> <question vote="0"> <p>我正在使用 Javascript 中的树状结构,我发现 Javascript 的 for 循环以意想不到的方式工作。让我描述一下:</p> <p></p><div data-babel="false" data-lang="js" data-hide="false" data-console="true"> <div> <pre><code>&lt;html&gt; &lt;head&gt;&lt;head&gt; &lt;body&gt; &lt;script&gt; class Test { constructor(name, children) { this.children = []; this.test = () =&gt; { let result = false; for (let i = 0; i &lt; this.children.length; i++) { console.log(this.children[i].name); result = result || this.children[i].test(); } if (this.name.includes(&#39;2&#39;)) result = true; return result; }; this.name = name; this.children = children; } } const t = new Test(&#39;1&#39;, [ new Test(&#39;11&#39;, [ new Test(&#39;111&#39;, []), new Test(&#39;112&#39;, []), ]), new Test(&#39;12&#39;, [ new Test(&#39;121&#39;, []), new Test(&#39;122&#39;, []), ]), ]); const result = t.test(); console.log(result); &lt;/script&gt; &lt;/body&gt; &lt;/html&gt;</code></pre> </div> </div> <p></p> <p>上面的代码是纯Javascript。 <pre><code>Test</code></pre> 班级可能有孩子,这些孩子也是 <pre><code>Test</code></pre> 班级。它还有一个返回布尔值的 <pre><code>test()</code></pre> 方法,该方法对其子级进行 for 循环,调用子级的 <pre><code>test()</code></pre> 方法,然后使用 <pre><code>||</code></pre> 运算符对结果求和。</p> <p>(所以它是对子节点的一种逻辑Some()操作的实现。)</p> <p><strong>但是,上面的代码并没有调用名称为 <pre><code>test()</code></pre> 和 <pre><code>121</code></pre> 的测试实例的 <pre><code>122</code></pre> 方法。</strong></p> <ul> <li><p>如果我更换以下部分,</p> <pre><code>result = result || this.children[i].test(); </code></pre> <p>与</p> <pre><code>const subResult = this.children[i].test(); result = result || subResult; </code></pre> <p><strong>然后就可以正常工作了。它会迭代所有子级。</strong></p> </li> <li><p>如果我将 for 循环修改如下,</p> <pre><code>for (let i = 0; i &lt;= this.children.length; i++) { // &lt;----- &#39;&lt;&#39; has been replaced with &#39;&lt;=&#39; if (i === this.children.length) { console.log(i); // this prints &#39;2&#39; after calling &#39;0&#39; } console.log(this.children[i].name); result = result || this.children[i].test(); } </code></pre> <p>我可以看到for循环的索引跳出来了。</p> </li> <li><p>如果我通过删除 <pre><code>false</code></pre> 使方法返回 <pre><code>if (this.name.includes(&#39;2&#39;)) result = true;</code></pre>,则调用所有子级的 <pre><code>test()</code></pre> 方法。</p> </li> <li><p>我在Chrome、Firefox和Safari中测试了上述代码,得到了相同的结果。</p> </li> </ul> <p>这种行为正确吗?如果是的话,有人能给我解释一下这个理论吗?</p> </question> <answer tick="false" vote="0"> <p>这称为短路求值 - 当 <pre><code>||</code></pre> 的第一个操作数为真时,第二个操作数不会被执行(不需要,因为整个表达式已经为真):</p> <p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_OR#short-circuit_evaluation" rel="nofollow noreferrer">https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_OR#short- Circuit_evaluation</a></p> </answer> </body></html>

回答 0 投票 0

Jetpack Compose 中的状态提升

这篇文章已被编辑,以便为我的问题提供更多背景信息。 “最终”版本,我可以用我目前的知识和我能更好理解的解决方案来开发......

回答 3 投票 0

为什么函数声明会被提升而函数表达式却不会?

根据吊装定义: 提升是一种 JavaScript 机制,其中变量和函数 在代码执行之前声明被移至其作用域的顶部 为什么函数要声明...

回答 1 投票 0

为什么函数表达式的位置在 Node js 中不重要?

在 JavaScript 中,当使用函数表达式(例如 var myFunc = function() {...})时,与任何其他变量声明一样,您必须在使用它之前定义变量。例如下面的

回答 1 投票 0

关闭和功能提升 - 在 firefox 上不起作用

以下代码在 Firefox 浏览器的某些版本上出现错误 - linksHandle 未定义。 该代码由一个函数组成,该函数的底部有一个名为 linksHandle 的函数。到目前为止...

回答 1 投票 0

函数表达式和函数声明的 JavaScript 提升[重复]

我正在学习 JavaScript 中的提升并练习一些示例。 在一个例子中,我对其输出感到困惑。 这是示例代码: var f = 函数(){ console.log("表达式"); }

回答 2 投票 0

为什么命名函数表达式的“typeof”返回未定义? [重复]

我是 JS 新手,所以如果这听起来很愚蠢,请原谅我。我正在研究函数声明和函数表达式的概念。 我有以下代码: var printSomething = 有趣...

回答 1 投票 0

变量提升与编程语言其他方面之间的交互

以下 Python 程序 A 按预期输出 1,而以下 Python 程序 B 则引发未绑定局部变量 x 错误,这与直觉相反。 方案A: def f(): 打印(x) x = 1 F() 普...

回答 1 投票 0

变量提升与编程语言其他方面之间的交互[关闭]

以下 Python 程序 A 按预期输出 1,而以下 Python 程序 B 则引发未绑定局部变量 x 错误,这与直觉相反。 方案A: def f(): 打印(x) x = 1 F() 普...

回答 1 投票 0

如何做二层或三层状态提升机?

想象一个可组合的 A,它有一个较低的可组合的 B,它有一个更低的可组合的 C,并且有一些按钮。 按钮必须更改存储在可组合 A 中的状态记忆变量。st...

回答 1 投票 0

提升、作用域和函数声明

以下是简单的代码: { 函数 a() {} a =“测试”; } 控制台.log(a); 此代码将 ƒ a() {} 打印到控制台中。这是为什么?谁能解释这种行为? 我期望得到&...

回答 1 投票 0

函数声明是否在变量声明之前提升?

如果函数声明在变量声明之前被提升。在这种情况下,为什么我得到函数定义而不是未定义。 函数 a(){} 变量a; 控制台.log(a); // ▪a()...

回答 1 投票 0

为什么我可以在初始化之前使用箭头javascript函数

我查看了为什么我可以在 JavaScript 中定义函数之前使用它?。它说我可以在使用声明函数时在初始化之前或之后使用函数。然而对于

回答 1 投票 0

为什么在之后创建的变量上使用 console.log() 但在另一个脚本标记中时,我会收到错误而不是在控制台中记录“未定义”? [重复]

为什么此代码片段会在控制台中给出错误“Uncaught ReferenceError: x is not Defined” 控制台.log(x); <

回答 1 投票 0

相同情况下不同的未捕获引用错误

我不明白为什么在这些相同的情况下控制台会返回两个不同的输出 控制台.log(a); 设 a = 1; 控制台说 a 未定义 和这里 函数 a1() { 控制台.log(a); 让...

回答 1 投票 0

Mutablestateof - 状态提升

如何在两个函数中管理一种状态? (打开对话框) 如何将 openDialog 状态从 ProductDialog() 转移到 AppBar()? 我知道我可以为每个州开设一个单独的课程,但我不想这样做。 @

回答 1 投票 0

吊装问题android Jetpack compose

我是 Jetpack Compose 的新手,对提升主题有疑问。我创建了一个带有按钮的非常基本的应用程序,该应用程序显示您单击该按钮的次数。我有...

回答 1 投票 0

考虑到函数提升,为什么这三个 JavaScript 示例会产生不同的输出?

问题 我试图理解为什么以下三个 JavaScript 示例会产生不同的输出,尽管它们似乎都涉及函数提升。输出不应该是一样的吗...

回答 1 投票 0

导入模块是否意味着在导入语句行嵌入模块的代码?

来自 ReferenceError:在初始化之前无法访问词法声明 'X' - JavaScript | MDN,有一个无效导入的例子: a.js(入口模块): 从“./b.js”导入{b};

回答 1 投票 0

console.log 语句在函数内部和函数外部执行时有所不同

函数 func(){ 变量名称 控制台.log(名称) 名称=“帕文” 控制台.log(名称) } 函数() 当我运行上面的代码时 它给了我输出 输出1 不明确的 帕万 ----------...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.