【问题标题】:Javascript: Dynamic function names [duplicate]Javascript:动态函数名称[重复]
【发布时间】:2012-12-20 03:33:21
【问题描述】:

如何创建具有动态名称的函数?比如:

function create_function(name){
   new Function(name, 'console.log("hello world")');
}
create_function('example');
example(); // --> 'hello world'

函数也应该是一个函数对象,这样我就可以修改对象的原型。

【问题讨论】:

  • 您能解释一下您要解决的问题吗?
  • @Philipp:例如,OP 可能有兴趣用另一个构造函数替换一些构造函数,但给它与原始构造函数相同的名称,因此代码会看到相同的函数名称。这可能是我面临的原因之一。但我敢肯定还有其他人。

标签: javascript function dynamic


【解决方案1】:

我在过去 3 个小时里一直在玩这个,最后按照其他线程上的建议使用 new Function 至少有点优雅:

/**
 * JavaScript Rename Function
 * @author Nate Ferrero
 * @license Public Domain
 * @date Apr 5th, 2014
 */
var renameFunction = function (name, fn) {
    return (new Function("return function (call) { return function " + name +
        " () { return call(this, arguments) }; };")())(Function.apply.bind(fn));
};   

/**
 * Test Code
 */
var cls = renameFunction('Book', function (title) {
    this.title = title;
});

new cls('One Flew to Kill a Mockingbird');

如果您运行上述代码,您应该会在控制台中看到以下输出:

Book {title: "One Flew to Kill a Mockingbird"}

【讨论】:

    【解决方案2】:
    window.example = function () { alert('hello world') }
    example();
    

    name = 'example';
    window[name] = function () { ... }
    ...
    

    window[name] = new Function('alert("hello world")')
    

    【讨论】:

    • Add a fiddle 在您的回答中。
    • 我不知道为什么错误的答案是高级别的。作者在运行时需要一个命名函数,而不是全局名称来访问。
    • 下面的帖子是更好的方法还是这个?
    • @EhsanSajjad 我的回复和 ConnorBlack 的回复是一样的。不同的是,他将函数对象存储在一个变量中,而我将它存储在一个window对象中,只是为了证明如果您使用window,您可以在任何地方访问该函数。
    • 我更喜欢下面的答案,因为它不会污染全局范围。
    猜你喜欢
    • 1970-01-01
    • 2013-01-19
    • 2014-05-17
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多