답변:
문자열에서 함수를 만드는 4 가지 방법에 대한 jsperf 테스트를 추가했습니다.
Function 클래스와 함께 RegExp 사용
var func = "function (a, b) { return a + b; }".parseFunction();
"return"과 함께 Function 클래스 사용
var func = new Function("return " + "function (a, b) { return a + b; }")();
공식 함수 생성자 사용
var func = new Function("a", "b", "return a + b;");
Eval 사용
eval("var func = function (a, b) { return a + b; };");
문자열에서 함수를 만드는 더 좋은 방법은 다음을 사용하는 것입니다 Function
.
var fn = Function("alert('hello there')");
fn();
이것은 현재 범위의 변수 (전역 적이 지 않은 경우)가 새로 생성 된 함수에 적용되지 않는다는 장점 / 단점을 가지고 있습니다.
인수 전달도 가능합니다.
var addition = Function("a", "b", "return a + b;");
alert(addition(5, 3)); // shows '8'
Function
. 로컬 스코프를 오염시키지 않기 eval
때문에 엔진 최적화가 너무 어려워집니다. OP 예제를 사용하면 다음을 수행합니다.var fnc = Function('return '+s)();
element.onclick = function() { alert("test"); }
.
당신은 꽤 가깝습니다.
//Create string representation of function
var s = "function test(){ alert(1); }";
//"Register" the function
eval(s);
//Call the function
test();
여기 에 작동하는 바이올린이 있습니다.
eval
미래의 검색 결과에 표시하는 경고 : eval
: 해커에 대한 허점을 열 수 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...을 하지만 당신은 그 위험을 알고 그들을 피할 수 있다면, 다음이에 좋은 간단한 방법입니다 문자열에서 함수를 작성
예, 사용 Function
은 훌륭한 솔루션이지만 조금 더 나아가 문자열을 구문 분석하고 실제 JavaScript 함수로 변환하는 범용 파서를 준비 할 수 있습니다.
if (typeof String.prototype.parseFunction != 'function') {
String.prototype.parseFunction = function () {
var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi;
var match = funcReg.exec(this.replace(/\n/g, ' '));
if(match) {
return new Function(match[1].split(','), match[2]);
}
return null;
};
}
사용 예 :
var func = 'function (a, b) { return a + b; }'.parseFunction();
alert(func(3,4));
func = 'function (a, b) { alert("Hello from function initiated from string!"); }'.parseFunction();
func();
여기 jsfiddle입니다
JavaScript
Function
var name = "foo";
// Implement it
var func = new Function("return function " + name + "(){ alert('hi there!'); };")();
// Test it
func();
// Next is TRUE
func.name === 'foo'
출처 : http://marcosc.com/2012/03/dynamic-function-names-in-javascript/
eval
var name = "foo";
// Implement it
eval("function " + name + "() { alert('Foo'); };");
// Test it
foo();
// Next is TRUE
foo.name === 'foo'
sjsClass
https://github.com/reduardo7/sjsClass
Class.extend('newClassName', {
__constructor: function() {
// ...
}
});
var x = new newClassName();
// Next is TRUE
newClassName.name === 'newClassName'
이 기술은 궁극적으로 eval 방법과 동일 할 수 있지만 일부에 유용 할 수 있으므로 추가하고 싶었습니다.
var newCode = document.createElement("script");
newCode.text = "function newFun( a, b ) { return a + b; }";
document.body.appendChild( newCode );
이것은 기능적으로이 <script> 요소를 문서 끝에 추가하는 것과 같습니다. 예 :
...
<script type="text/javascript">
function newFun( a, b ) { return a + b; }
</script>
</body>
</html>
new Function()
내부에 리턴이있는를 사용하고 즉시 실행하십시오.
var s = `function test(){
alert(1);
}`;
var new_fn = new Function("return " + s)()
console.log(new_fn)
new_fn()
동적 인수가있는 예 :
let args = {a:1, b:2}
, fnString = 'return a + b;';
let fn = Function.apply(Function, Object.keys(args).concat(fnString));
let result = fn.apply(fn, Object.keys(args).map(key=>args[key]))