我下面有一个简单的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/