首页  >  文章  >  web前端  >  尽管类似的示例有效,但为什么此 JavaScript 代码会失败?

尽管类似的示例有效,但为什么此 JavaScript 代码会失败?

Linda Hamilton
Linda Hamilton原创
2024-10-25 07:59:29461浏览

Why Does This JavaScript Code Fail, Even Though Similar Examples Work?

JavaScript 函数声明和求值顺序

背景:

在 JavaScript 中,函数可以是使用表达式声明或创建。函数声明发生在编译阶段,而函数表达式在执行阶段求值。理解这种区别对于理解 JavaScript 代码的行为至关重要。

问题:

为什么以下代码块中的第一个示例失败,而其余示例失败执行成功?

<code class="javascript">// 1 - does not work
(function() {
  setTimeout(someFunction1, 10);
  var someFunction1 = function() { alert('here1'); };
})();

// ... other examples</code>

答案:

第一个示例的失败不是由于范围或闭包问题,而是由于声明和表达式之间的误解.

函数声明与表达式:

  • 函数声明遵循语法:函数名称(参数){code}
  • 函数表达式被写成表达式,类似于函数声明,但在运行时计算。

阶段1:编译

在编译期间,编译器处理函数声明,为函数创建变量。在第一个示例中,变量 someFunction1 已创建,但仍处于未定义状态,因为其值(函数体)稍后计算。

阶段 2:执行

示例 1:

在运行时,解释器遇到 setTimeout(someFunction1, 10) 并尝试将未定义的 someFunction1 传递给 setTimeout。

示例 2:

相反,函数 someFunction2() 是一个声明,在编译期间创建函数。当 setTimeout 被调用时,它接收编译后的函数引用。

示例 3:

这里,一个匿名函数被传递给 setTimeout,它创建了一个变量的闭包一些功能3。当setTimeout触发时,someFunction3已被赋值,函数执行成功。

示例4:

与示例2类似,声明了函数someFunction4,使得它的引用可用于 setTimeout。

其他说明:

  • JavaScript 中的函数参数通过基本类型的值传递和对象的引用传递。这意味着 setTimeout 不会收到 someFunction 的闭包。
  • 理解声明和表达式之间的区别对于预测 JavaScript 代码的行为至关重要。

以上是尽管类似的示例有效,但为什么此 JavaScript 代码会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn