javascript - 如何在 JavaScript 中有条件地声明函数

标签 javascript

我下面有一个简单的javascript,但似乎if语句没有正确执行,这取决于最后放置的语句,结果将是n+2或n*2,而x%2始终为0:

<html>
<script>

var x=10;
while (x<2000) {
if (x%2==0) function collatz(n) {return n+2;}
if (x%2==1) function collatz(n) {return 2*n;}

x=collatz(x);
document.write(x, ",");
}

</script>
</html>

最佳答案

JavaScript 语言在函数声明语句方面有一些不直观的行为:它们实际上是在包含范围的开头处理的,而不是在执行顺序中遇到它们时处理的。

这就是为什么您可以在定义函数之前调用它:

var x = foo();

function foo() {
    return 1;
}

尽管您将函数语句放置在 if 主体中,但 instantiate-at-entry 规则意味着一旦该程序开始执行,这些函数就会被插入到本地作用域中,第二个函数将被插入到本地作用域中。替换第一个,因为它们是按“源文本顺序”处理的。

您可以使用函数表达式而不是函数语句来避免这种行为。

var foo;
if (condA) foo = function () { ... };
if (condB) foo = function () { ... };
foo();

当以这种形式定义函数时,只有在遇到该函数时才会对其求值,正如您所期望的那样。

因此我们可以按如下方式重写您的程序:

var x = 10;
var collatz;
while (x<2000) {
    if (x%2==0) collatz = function (n) {return n+2;};
    if (x%2==1) collatz = function (n) {return 2*n;};

    x = collatz(x);
    document.write(x, ",");
}

您可以在Section 10.5 of the EcmaScript specification的第5步中看到血淋淋的细节。 .

关于javascript - 如何在 JavaScript 中有条件地声明函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27699747/

相关文章:

JavaScript: "function onload() {}"与 "onload = function() {}"有何不同?

javascript - 使用特定用户的 javascript API 发布到页面墙

javascript - 固定面板 extjs 4.2 的大小

javascript - jQuery 悬停太慢

javascript - 使用 Javascript 启用复选框

JavaScript : Always Redirect To HTTPS

javascript - 程序生成 3000 个正方形

javascript - 为什么 GetElementsByTagName 不能以这种形式工作?

javascript - 在 Replace() 方法中使用变量 - Javascript

javascript - React 和 React Native 意义上的父组件和子组件是什么意思?