相关疑难解决方法(0)

GOTO仍被视为有害吗?

每个人都知道Dijkstra 给编辑信件:转到被认为有害的声明(也就是这里 .html脚本和这里的 .pdf)并且从那时起就有一个强大的推动,尽可能避开goto声明.虽然可以使用goto来生成不可维护的,庞大的代码,但它仍然保留在现代编程语言中.甚至Scheme中的高级连续控制结构也可以被描述为复杂的goto.

什么情况下可以使用goto?什么时候最好避免?

作为后续问题:C提供了一对函数setjmp和longjmp,它们不仅可以在当前堆栈帧内,而且可以在任何调用帧中进行转换.这些应该被视为像goto一样危险吗?更危险吗?


Dijkstra本人对这个头衔表示遗憾,他对此不负责任.在EWD1308(也是这里 .pdf)结束时,他写道:

最后是一个短篇小说的记录.1968年,ACM的通讯以" 被认为有害的goto声明 "的标题发表了我的一篇文章,遗憾的是,在后来的几年中,这一期刊最常被引用,但是,经常被作者看到的不多于标题,通过成为一个模板成为我的名声的基石:我们会看到几乎任何X的标题"X被认为有害"的各种文章,包括一个标题为"Dijkstra被认为有害"的文章.但是发生了什么?我提交了一份题为" 反对goto声明的案件 "的论文"为了加快出版速度,编辑已经变成了一封"给编辑的信",并在此过程中给了他一个新的自己的发明名称!编辑是Niklaus Wirth.

关于这个主题的经过深思熟虑的经典论文,与Dijkstra的相关,是结构化编程,由Donald E. Knuth撰写.阅读都有助于重新建立背景和对主题的非教条性理解.在本文中,Dijkstra对此案的观点得到了报道,甚至更为强烈:

Donald E. Knuth:我相信通过提出这样一种观点,我实际上并不同意Dijkstra的观点,因为他最近写了以下内容:"请不要陷入相信我非常悲惨的陷阱.去发言.我有其他人正在一个宗教出来的不舒服的感觉,就好像编程的概念问题可以通过一个单一的技巧来解决,通过编码规则的简单形式! "

language-agnostic goto

273
推荐指数
27
解决办法
7万
查看次数

ES6尾递归优化堆栈溢出

阅读了Rauschmayer博士对es6中递归尾调用优化的描述之后,我一直试图重新创建他详细说明的递归因子函数的"零堆栈"执行.

使用Chrome调试器在堆栈帧之间切换,我发现尾部优化没有发生,并且正在为每次递归创建堆栈帧.

我也尝试通过在没有调试器的情况下调用函数来测试优化,而是传递100000给阶乘函数.这会引发"最大堆栈"错误,这意味着它实际上并未进行优化.

这是我的代码:

const factorial = (n, acc = 1) => n <= 1 ? acc : factorial(n - 1, n * acc)
console.log( factorial(100000) )
Run Code Online (Sandbox Code Playgroud)

结果:

Uncaught RangeError: Maximum call stack size exceeded
Run Code Online (Sandbox Code Playgroud)

javascript stack-overflow optimization recursion ecmascript-6

32
推荐指数
2
解决办法
7413
查看次数

为什么JavaScript设计为在返回后跟一个新行自动插入分号?

我遇到了一个我遇到的问题:

return
    isSomething() &&
    isSomethingElse();
Run Code Online (Sandbox Code Playgroud)

这是行不通的,因为javascript在返回后插入分号,使得上面的等价于:

return;
isSomething() && isSomethingElse();
Run Code Online (Sandbox Code Playgroud)

这完全让我感到困惑,为什么会这样做.我发现了一些关于该主题的StackOverflow问题(例如this,thisthis),但他们只是解释了"何时"这样做,参考规范.

我甚至无法想象我想要一个return;声明后跟一些其他有效的javascript语句的情况(除非你使用goto或者我可能没有听说过其他一些模糊的javascript).在我看来,这只会导致问题.

我想知道为什么会这样做.为什么这部分规范?

编辑:关于重复的结束.我想,我明确表示,我读其他的问题和答案,指出它是JavaScript的规范的一部分,甚至把区别于其他人在我的问题的一部分大胆.在密切原因中链接的问题包含对这个问题的答案,并且与我在回答我的问题时所链接的其他三个问题的形式完全相同.

javascript syntax

5
推荐指数
1
解决办法
345
查看次数

做javascript - 循环猜测游戏

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html> 
<head>
<title>Game</title>
<script type="text/javascript" src="game.js"></script>

</head>
<body>
    <h1>GameSite</h1>
    <p> This program will generate a random number. Please input your guess in the box!</p>
    <button onclick="guessGame()">Press me to play a quick game!</button>

<script>
    function guessGame(){
        number = Math.floor(Math.random()*11);
        document.write(number);
        var guess = prompt("Guess a number: ");
            do {
                guess = prompt("Keep guessing!");
                if (number < guess) {
                    prompt("You've guessed too high!");
                } else if (number > guess) {
                    prompt("You've guessed too low!");
                } else document.write("Good …
Run Code Online (Sandbox Code Playgroud)

javascript loops while-loop

4
推荐指数
1
解决办法
3841
查看次数

有没有办法运行旧版本的 JavaScript?

我想知道是否有任何方法可以让我在网络浏览器中运行旧版本的 javascript!我有需要 ECMAScript 3 的应用程序坏了,我想知道是否有办法在没有 polyfill 库的情况下运行旧版本!

javascript

3
推荐指数
1
解决办法
1257
查看次数

无法掌握这个javascript片段函数abc(){a:'b'; C: 'F'; F: 'T'; }; 谁能解释一下?

function abc(){
   a:'b'; 
   c:'f'; 
   f:'t'; 
};
Run Code Online (Sandbox Code Playgroud)

此代码段不会在控制台中引发错误.我想了解函数内部的变量发生了什么.它是由javascript引擎解释的.

javascript

0
推荐指数
1
解决办法
146
查看次数