Tot*_*.js 77 javascript function
我有这个:
this.f = function instance(){};
Run Code Online (Sandbox Code Playgroud)
我想要这个:
this.f = function ["instance:" + a](){};
Run Code Online (Sandbox Code Playgroud)
Mar*_*osc 111
这基本上是在最简单的层面上做到的:
"use strict";
var name = "foo";
var func = new Function(
"return function " + name + "(){ alert('sweet!')}"
)();
//call it, to test it
func();
Run Code Online (Sandbox Code Playgroud)
如果你想获得更多的幻想,我写了一篇关于" JavaScript中的动态函数名称 "的文章.
Dar*_*ren 32
您可以使用MDN JavaScript Reference [1]中提到的Object.defineProperty:
var myName = "myName";
var f = function () { return true; };
Object.defineProperty(f, 'name', {value: myName, writable: false});
Run Code Online (Sandbox Code Playgroud)
kyb*_*kos 25
在最近的引擎中,你可以做到
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"Run Code Online (Sandbox Code Playgroud)
Alb*_*bin 10
我认为通过使用eval,hacky解决方案或包装器,这里的大多数建议都不是最理想的.从ES2015开始,名称是从变量和属性的句法位置推断出来的.
所以这将工作得很好:
const name = 'myFn';
const fn = {[name]: function() {}}[name];
fn.name // 'myFn'
Run Code Online (Sandbox Code Playgroud)
抵制创建命名函数工厂方法的诱惑,因为您无法从外部传递函数并将其改装为语法位置以推断其名称.那已经太晚了.如果你真的需要它,你必须创建一个包装器.有人这样做了,但是这个解决方案不适用于类(也是函数).
所有变体的更深入的答案都写在这里:https://stackoverflow.com/a/9479081/633921
正如其他人提到的那样,这不是最快也不推荐的解决方案。Marcosc下面的解决方案是解决之道。
您可以使用eval:
var code = "this.f = function " + instance + "() {...}";
eval(code);
Run Code Online (Sandbox Code Playgroud)
默认情况下,该函数的name属性不是writeable,但由于它是,configurable我们仍然可以使用Object.defineProperty它来更改它。由于Object.defineProperty方便地返回对象本身,我们可以编写一个具有动态名称的函数,如下所示:
const theName = 'foobar'
const fn = Object.defineProperty(function () {
/* ... */
}, 'name', { value: theName })
console.log(fn.name) // Logs foobarRun Code Online (Sandbox Code Playgroud)
当然,这可以分解为辅助函数:
const nameFunction = (name, fn) => Object.defineProperty(fn, 'name', { value: name })
const fn = nameFunction('foobar', function () {
/* ... */
})
console.log(fn.name) // Logs foobarRun Code Online (Sandbox Code Playgroud)
当然,上面的nameFunction函数也可以用于重命名现有函数(这里只是重命名并返回匿名函数)。
| 归档时间: |
|
| 查看次数: |
76949 次 |
| 最近记录: |