在 JavaScript 中,代码执行涉及两个阶段:编译和求值。第一个示例失败是因为函数声明和表达式在这些阶段之间存在根本性误解。
函数声明使用 function 关键字并遵循语法:
function name (arguments) {code}
函数表达式 另一方面,在表达式上下文中编写,并遵循与声明相同的语法,只是它们用括号括起来。表达式是在执行过程中处理的,而不是在编译过程中处理的。
示例 1:
(function() { setTimeout(someFunction1, 10); var someFunction1 = function() { alert('here1'); }; })();
编译: SomeFunction1被定义为未定义。
执行: 使用 someFunction1 的未定义值调用 setTimeout。
示例 2:
(function() { setTimeout(someFunction2, 10); function someFunction2() { alert('here2'); } })();
编译: SomeFunction2 被声明为函数..
执行: 使用编译后的 someFunction2 函数调用 setTimeout。
示例 3:
(function() { setTimeout(function() { someFunction3(); }, 10); var someFunction3 = function() { alert('here3'); }; })();
编译: SomeFunction3 最初定义为未定义。
执行: 传递一个匿名函数setTimeout,创建 someFunction3 的闭包。随后,为 someFunction3 分配了一个函数,该函数会覆盖其未定义的值。
示例 4:
(function() { setTimeout(function() { someFunction4(); }, 10); function someFunction4() { alert('here4'); } })();
与示例 2 类似,someFunction4 在传递给之前声明setTimeout.
第一个示例失败,因为 someFunction1 在编译期间传递给 setTimeout 之前未声明。函数表达式必须在处理声明之后、在执行期间进行求值。因此,在使用函数表达式时,表达式的顺序至关重要,尤其是传递给像 setTimeout 这样的异步函数时。
以上是为什么在函数表达式中使用'setTimeout”时我的 JavaScript 代码会失败?的详细内容。更多信息请关注PHP中文网其他相关文章!