Ooi*_*oie 5 javascript if-statement
我需要对屏幕后面发生的事情进行一些确认。
MDN 中有一篇文章说我们不应该在块级声明函数,例如在 if 语句中。因为它在整个浏览器中都是不一致的,并且与 ES2015 之前(或 ES6 之前)有关。
除非条件为真,否则不会创建 if 语句中的函数。
我想知道,如果条件为真,假设在5分钟后的JavaScript加载和同步设置后,将其创建的功能?为了创建函数,它是否仍然有代码的内存,或者它是否被转储到未使用的代码中?
我想知道即使在if语句完成后该函数是否仍然存在。可以访问吗?多久可以访问?在 if 条件为假之前是否可以访问?结果与 ES6 和 ES6 之前的结果不同吗?我听说 if 语句中没有 ES6 之前的范围。
例如
if (condition) {
function foo() {console.log(“hello world”);
}
}
在阅读 MDN 中关于“非严格代码中的块级函数”下的“函数”的文章后,我感到很困惑:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions
\n\n如果条件为真,让\xe2\x80\x99s说JavaScript加载并同步设置后5分钟后,它会创建该函数吗?
\n
该函数将在运行后立即创建if。
\n\n它是否仍然具有用于创建函数的代码内存,或者是否将其转储到未使用的代码中?
\n我想知道 if 语句完成后该函数是否仍然存在。可以访问吗?多久可以访问?
\n
无论函数是否在块中声明,此行为都是相同的if:如果将来没有任何内容可能引用该函数(例如,如果块结束并且块内没有任何内容引用该函数),它最终会被垃圾收集。该函数可能仍会在内存中“存在”一段时间,直到 GC 运行。
例如,应该清楚的是,以下函数应该始终继续存在,至少在您重新加载页面之前:
\n// IIFE, to get off the top level\n(() => {\n if (true) {\n function foo() {\n console.log(\'clicked\');\n }\n window.addEventListener(\'click\', foo);\n }\n})();Run Code Online (Sandbox Code Playgroud)\r\n这是因为addEventListener已传递了对该函数的引用。
但以下foo函数将被 GC(可能在页面加载后一秒或几秒 - 这取决于底层引擎,并且对 Javascript 不可见):
// IIFE, to get off the top level\n(() => {\n if (true) {\n function foo() {\n console.log(\'clicked\');\n }\n }\n})();Run Code Online (Sandbox Code Playgroud)\r\n如果在变量范围的块完成时没有保存对函数的引用,则该函数将无法在任何地方访问,并且将被 GCd。
\n问题的其余部分看起来本质上与:“在哪里可以引用该函数”相同,这在 Bergi 的回答中得到了最好的描述。它有点复杂,并且行为会有所不同,具体取决于您是否使用严格模式、环境的 ES 版本以及环境本身(实现并不总是符合规范)。
\n对于可预测、易于阅读的代码,最好永远不要在非函数块中使用函数声明;仅当直接在函数块内时才使用函数声明。
\n(请注意,函数表达式,其中函数用作值并传递给某些东西或立即调用或显式分配给变量,与函数声明不同- 函数表达式很好,这只是有问题的函数声明。另请注意,根据注释,“函数声明”有时称为“函数语句”。)
\n| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |