[javascript] 자바 스크립트의 동적 함수 이름?

나는 이것을 가지고있다:

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});
  1. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Description


답변

최근 엔진에서는 다음을 수행 할 수 있습니다.

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 () {
}

속성 함수가 fan 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 예제의 의미와 구문으로 글로벌 컴퓨팅 환경을 최대한 유지합니다.