JavaScript 函数声明和求值顺序
背景:
在 JavaScript 中,函数可以是使用表达式声明或创建。函数声明发生在编译阶段,而函数表达式在执行阶段求值。理解这种区别对于理解 JavaScript 代码的行为至关重要。
问题:
为什么以下代码块中的第一个示例失败,而其余示例失败执行成功?
<code class="javascript">// 1 - does not work (function() { setTimeout(someFunction1, 10); var someFunction1 = function() { alert('here1'); }; })(); // ... other examples</code>
答案:
第一个示例的失败不是由于范围或闭包问题,而是由于声明和表达式之间的误解.
函数声明与表达式:
阶段1:编译
在编译期间,编译器处理函数声明,为函数创建变量。在第一个示例中,变量 someFunction1 已创建,但仍处于未定义状态,因为其值(函数体)稍后计算。
阶段 2:执行
示例 1:
在运行时,解释器遇到 setTimeout(someFunction1, 10) 并尝试将未定义的 someFunction1 传递给 setTimeout。
示例 2:
相反,函数 someFunction2() 是一个声明,在编译期间创建函数。当 setTimeout 被调用时,它接收编译后的函数引用。
示例 3:
这里,一个匿名函数被传递给 setTimeout,它创建了一个变量的闭包一些功能3。当setTimeout触发时,someFunction3已被赋值,函数执行成功。
示例4:
与示例2类似,声明了函数someFunction4,使得它的引用可用于 setTimeout。
其他说明:
以上是尽管类似的示例有效,但为什么此 JavaScript 代码会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!