递归提示函数返回null

时间:2019-01-03 13:05:24

标签: javascript variables if-statement prompt

我想构建一个提示功能,该提示功能将提示用户输入一个值,然后返回该值。

为什么我在强制模式下输入然后输入一个值,为什么此代码返回 null ?谁能做到?

function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';
  if (typeof mandantory === 'undefined')
    return prompt(text, defaultText);
  else {
    var a = prompt(text, defaultText);
    if (a === '') {
      return UserInput(text, defaultText, mandantory);
    } else {
      return null;   
    }
  }
}
<!DOCTYPE html>
<html>
	<head>
		<title>Page Title</title>
	</head>
	<body>
		<button onclick="alert(UserInput('prompt with input', ''))">prompt with input</button><br/>
		<button onclick="alert(UserInput('prompt with mandantory input', '', 0))">prompt with mandantory input</button>
	</body>
</html>

注意:必须从onclick =“ ...”调用它。

谢谢, 德扬

4 个答案:

答案 0 :(得分:1)

它返回null是因为如果return nulla以外的其他事物,则您称自己为'',则必须返回a

function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';
  if (typeof mandantory === 'undefined')
    return prompt(text, defaultText);
  else {
    var a = prompt(text, defaultText);
    if (a === '') {
      return UserInput(text, defaultText, mandantory);
    } else {
      return a;
    }
  }
}
<!DOCTYPE html>
<html>

<head>
  <title>Page Title</title>
</head>

<body>
  <button onclick="alert(UserInput('prompt with input', ''))">prompt with input</button><br/>
  <button onclick="alert(UserInput('prompt with mandantory input', '', 0))">prompt with mandantory input</button>
</body>

</html>

但是我会在这里使用while做while循环而不是递归:

function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';

  var a

  do {
    // the first prompt will always be called
    a = prompt(text, defaultText)
    // repeat the loop while  a === '' and mandantory !== 'undefined'
  } while (mandantory !== 'undefined' && a === '')

  return a;
}
<!DOCTYPE html>
<html>

<head>
  <title>Page Title</title>
</head>

<body>
  <button onclick="alert(UserInput('prompt with input', ''))">prompt with input</button><br/>
  <button onclick="alert(UserInput('prompt with mandantory input', '', 0))">prompt with mandantory input</button>
</body>

</html>

答案 1 :(得分:1)

之所以返回null,是因为如果输入了值,则您将在else中返回它。当elsea不同时,您需要在上一个null中返回a而不是''

if (a === '') {
  return UserInput(text, defaultText, mandantory);
} else {
  return a;   
}

注意:

要检查是否定义了变量,可以只使用if(mandatory)而不是编写if(typeof mandantory === 'undefined')

演示:

function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';
  if (mandantory)
    return prompt(text, defaultText);
  else {
    var a = prompt(text, defaultText);
    if (a === '') {
      return UserInput(text, defaultText, mandantory);
    } else {
      return a;   
    }
  }
}
<!DOCTYPE html>
<html>
	<head>
		<title>Page Title</title>
	</head>
	<body>
		<button onclick="alert(UserInput('prompt with input', ''))">prompt with input</button><br/>
		<button onclick="alert(UserInput('prompt with mandantory input', '', 0))">prompt with mandantory input</button>
	</body>
</html>

答案 2 :(得分:0)

在您的代码段中:

  1. 如果a不为零,则始终返回null,而应返回return a
  2. 如果有else条语句,则不需要return分支
  3. 您可以使用默认参数
  4. 必填项(typo)=> n
  5. 应避免多个分支返回相同的值

您可以编写如下函数:

const UserInput = async (text, defaultText = '', mandatory = false) => {
  const result = await prompt(text, defaultText);
  
  if (!result && mandatory) {
    console.log('User did not enter a correct value, try again');
    return UserInput(text, defaultText, mandatory);
  }
  
  console.log(`Returning Value: "${result}"`);
  return result;
};

document
  .getElementById('test')
  .addEventListener('click', () => UserInput('Say Something', '', true))
;
<button id="test">Try</button>

答案 3 :(得分:0)

您可以这样做

data <- read.table(text = "INr         FNr         TM          I1              I2
1           1           B2          1598,45         0,14
                   2           1           B2          930,40          0,11
                   3           1           B2          107,86          0,04
                   4           1           B2          881,09          0,11
                   7           1           B3          2201,98         0,15
                   8           1           B3          161,30          0,04
                   9           1           B3          1208,14         0,17
                   4           2           B3          831,75          0,12
                   5           2           B3          1027,41         0,14
                   7           2           B3          2052,16         0,15
                   8           2           B3          159,63          0,05
                   9           2           B4          1111,49         0,16
                   10          2           B4          1312,15         0,12
                   1           3           B4          863,79          0,10
                   2           3           B4          104,06          0,04
                   3           3           B4          816,02          0,11
                   4           3           B4          1053,02         0,14
                   5           3           B5          132,32          0,03
                   6           3           B5          2059,03         0,14
                   7           3           B5          153,49          0,04
                   8           3           B5          1118,69         0,15
                   9           3           B5          1632,66         0,18
                   10          3           B5          1302,15         0,12", header = T)
function UserInput(text, defaultText, mandantory) {
  if (typeof defaultText === 'undefined')
    defaultText = '';
  if (typeof mandantory === 'undefined')
    return prompt(text, defaultText);
  else {
    var a = prompt(text, defaultText);
    if (a === '') {
      return UserInput(text, defaultText, mandantory);
    } else if (a !== null) {
      return a;   
    } else {
      return null;   
    }
  }
}