나는 이것을 가지고있다:
this.f = function instance(){};
나는 이것을 갖고 싶다 :
this.f = function ["instance:" + a](){};
답변
최신 정보
다른 사람들이 언급했듯이 이것은 가장 빠르거나 가장 권장되는 솔루션이 아닙니다. 아래 Marcosc의 해결책 은 갈 길입니다.
eval을 사용할 수 있습니다.
var code = "this.f = function " + instance + "() {...}";
eval(code);
답변
이것은 기본적으로 가장 간단한 수준에서 수행합니다.
"use strict";
var name = "foo";
var func = new Function(
"return function " + name + "(){ alert('sweet!')}"
)();
//call it, to test it
func();
좀 더 멋지게 만들고 싶다면 ” JavaScript의 동적 함수 이름 “에 대한 기사를 작성했습니다 .
답변
MDN JavaScript Reference [1]에 명시된대로 Object.defineProperty를 사용할 수 있습니다.
var myName = "myName";
var f = function () { return true; };
Object.defineProperty(f, 'name', {value: myName, writable: false});
답변
최근 엔진에서는 다음을 수행 할 수 있습니다.
function nameFunction(name, body) {
return {[name](...args) {return body(...args)}}[name]
}
const x = nameFunction("wonderful function", (p) => p*2)
console.log(x(9)) // => 18
console.log(x.name) // => "wonderful function"
답변
여기에서 대부분의 제안은 eval, hacky 솔루션 또는 래퍼를 사용하여 차선책이라고 생각합니다. ES2015에서 이름은 변수 및 속성의 구문 위치에서 유추됩니다.
따라서 이것은 잘 작동합니다.
const name = 'myFn';
const fn = {[name]: function() {}}[name];
fn.name // 'myFn'
이름을 추론하기 위해 외부에서 함수를 전달하고 구문 위치로 개조 할 수 없기 때문에 명명 된 함수 팩토리 메서드를 만들려는 유혹에 저항하십시오. 그럼 벌써 너무 늦었어요. 정말로 필요하다면 래퍼를 만들어야합니다. 누군가 여기서 그렇게했지만 그 솔루션은 클래스 (함수이기도 함)에서는 작동하지 않습니다.
설명 된 모든 변형에 대한 훨씬 더 자세한 답변이 여기에 작성되었습니다 : https://stackoverflow.com/a/9479081/633921
답변
는 어때
this.f = window["instance:" + a] = function(){};
유일한 단점은 toSource 메서드의 함수가 이름을 나타내지 않는다는 것입니다. 이는 일반적으로 디버거의 문제 일뿐입니다.
답변
구문 은 이름으로 인덱싱 된 function[i](){}
함수 인 속성 값이있는 객체를 의미합니다 .
따라서 .function[]
[i]
{"f:1":function(){}, "f:2":function(){}, "f:A":function(){}, ... } ["f:"+i]
{"f:1":function f1(){}, "f:2":function f2(){}, "f:A":function fA(){}} ["f:"+i]
함수 이름 식별을 유지합니다. 에 대한 아래 참고를 참조하십시오 :
.
그래서,
javascript: alert(
new function(a){
this.f={"instance:1":function(){}, "instance:A":function(){}} ["instance:"+a]
}("A") . toSource()
);
({f:(function () {})})
FireFox에 표시됩니다 .
(이것은 이 솔루션 과 거의 같은 아이디어 입니다. . 단지 일반 객체를 사용하고 더 이상 함수로 창 객체를 직접 채우지 않습니다.)
이 메서드는 환경을 명시 적으로 instance:x
.
javascript: alert(
new function(a){
this.f=eval("instance:"+a+"="+function(){})
}("A") . toSource()
);
alert(eval("instance:A"));
디스플레이
({f:(function () {})})
과
function () {
}
속성 함수가 f
an anonymous function
과 not을 참조 하지만 instance:x
이 방법은 이 솔루션에서 몇 가지 문제를 방지 합니다 .
javascript: alert(
new function(a){
eval("this.f=function instance"+a+"(){}")
}("A") . toSource()
);
alert(instanceA); /* is undefined outside the object context */
표시 만
({f:(function instanceA() {})})
- 임베디드
:
는 자바 스크립트를 만듭니다function instance:a(){}
유효하지 않게 . - 참조 대신 함수의 실제 텍스트 정의는에 의해 구문 분석되고 해석됩니다
eval
.
다음은 반드시 문제가되는 것은 아닙니다.
- 이
instanceA
기능은 다음과 같이 직접 사용할 수 없습니다.instanceA()
따라서 원래 문제 컨텍스트와 훨씬 더 일치합니다.
이러한 고려 사항을 감안할 때
this.f = {"instance:1": function instance1(){},
"instance:2": function instance2(){},
"instance:A": function instanceA(){},
"instance:Z": function instanceZ(){}
} [ "instance:" + a ]
OP 예제의 의미와 구문으로 글로벌 컴퓨팅 환경을 최대한 유지합니다.