【问题标题】:JS Check if input string is valid code and run inputJS 检查输入字符串是否为有效代码并运行输入
【发布时间】:2017-04-01 08:48:33
【问题描述】:

所以我真的找不到太多关于这个的东西。这个想法是我有一个用户输入(文本),我想检查它在 JS 中的代码是否有效,然后运行它。

我知道如果userInput 实际上是一个函数,我可以做if (typeof userInput === "function") {,但此时用户输入只是一个字符串输入,所以我很卡住,它还包含任何参数或其他代码。

例如,输入可能是 "alert('test')",这将是有效的,我想运行它,但是像 "madeUpFunction(lol)" 这样的输入将是无效的。

如果我能让函数正常工作而不是任何 JS 代码,我会很高兴。

【问题讨论】:

  • 描述有效函数?
  • 你试图做的相当于解析 JavaScript 语法。您可以让 JavaScript 运行时本身通过 eval() 来完成它,但这显然并非没有风险和复杂性。
  • 字符串是字符串,永远不可能是函数。
  • @MattCowley Function !== 函数调用。根本不清楚你有什么,你想要什么。
  • @Oriol 我在问题中添加了一个示例。

标签: javascript string function typeof


【解决方案1】:

您可以提取字符串直到第一个( 以获取函数名称,然后使用typeof eval(funcName) 测试它是否存在。然后使用Function 构造函数确保语法对其余参数有效,而无需实际执行代码。

然后您可以返回执行用户输入内容的函数,但请注意,如果您决定执行该函数,可能会出现安全问题。

function parseFunctionCall(str) {
  var funcName = str.slice(0, str.indexOf('('));
  if (typeof eval(funcName) === 'function') {
    return new Function(str);
  } else {
    throw new Error('Invalid function name');  
  }
}

console.log(parseFunctionCall("console.log('hi')"));

【讨论】:

  • 这太好了,谢谢!但是,如果我输入console.log('test') 它不会检测到它?
  • 那是因为console.log 正在选择一个不在window 上的函数。我已经更新为使用eval,但there are more efficient ways to do it
【解决方案2】:

你可以使用 eval("typeof "+ input) 来实现你想要的。 eval() 函数的参数是一个字符串。如果字符串表示表达式,则 eval() 计算表达式。

var myFunc = function(){};
var input = prompt('Enter input string');

if(eval("typeof "+input) === "function"){
	document.getElementById('d1').innerHTML = "Yes it's a funtion";
}

else{
  document.getElementById('d1').innerHTML = "Not a funtion";
}
  
<div id="d1">

</div>

【讨论】:

    【解决方案3】:

    假设这是在浏览器中,并且您要检查的功能在全局范围内:

    if (typeof window[userInput] === "function" ) {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      相关资源
      最近更新 更多