首页 > web前端 > js教程 > 正文

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

Linda Hamilton
发布: 2024-10-25 07:59:29
原创
460 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!