我有这个:
this.f = function instance(){};
我想要这个:
this.f = function ["instance:" + a](){};
我有这个:
this.f = function instance(){};
我想要这个:
this.f = function ["instance:" + a](){};
这基本上会在最简单的级别上完成:
"use strict";
var name = "foo";
var func = new Function(
"return function " + name + "(){ alert('sweet!')}"
)();
//call it, to test it
func();
如果你想变得更花哨,我写了一篇关于“ JavaScript 中的动态函数名称”的文章。
您可以按照MDN JavaScript 参考中的说明使用 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"
2021 年更新:CherryDT 的答案现在应该是最简单、最直接的方法,但它在堆栈跟踪或 Function.prototype.toString() 的不同浏览器中无法一致地工作,因此如果您需要,您会坚持使用这种不太方便的方法解决方案。
旧答案:通过使用 eval、hacky 解决方案或包装器,这里的许多建议都是次优的。自 ES2015 起,名称是从变量和属性的句法位置推断出来的。
所以这将工作得很好:
const name = 'myFn';
const fn = {[name]: function() {}}[name];
fn.name // 'myFn'
抵制创建命名函数工厂方法的诱惑,因为您将无法从外部传递函数并将其改造成句法位置以推断其名称。那么已经晚了。如果你真的需要它,你必须创建一个包装器。有人在这里这样做了,但该解决方案不适用于类(也是函数)。
这里已经写了一个更深入的所有变体的答案:https : //stackoverflow.com/a/9479081/633921
正如其他人提到的,这不是最快也不是最推荐的解决方案。Marcosc 下面的解决方案是要走的路。
您可以使用评估:
var code = "this.f = function " + instance + "() {...}";
eval(code);