JS检查输入字符串是否是有效代码并运行输入

时间:2016-11-17 17:18:41

标签: javascript string function typeof

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

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

例如,输入可能是"alert('test')"且有效,我想运行该输入,但"madeUpFunction(lol)"之类的内容无效。

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

3 个答案:

答案 0 :(得分:2)

您可以将字符串提取到第一个(以获取函数名称,然后使用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')"));

答案 1 :(得分:0)

您可以使用eval(“typeof”+输入)来实现您想要的效果。 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>

答案 2 :(得分:-1)

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

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